C语言中%s打印char数组为空但逐字符打印正常的问题排查
问题原因
printf的%s格式符打印字符串时,会从传入的内存地址开始逐字符读取,直到遇到值为0的'\0'字符串终止符才会停止输出。
你的代码中计算数组长度size时已经把末尾的'\0'算入了长度,但两层冒泡排序的循环边界写为i < size、j < size,把数组最后一位的'\0'也纳入了排序范围。'\0'的ASCII值为0,比所有大小写字母的ASCII值都小,排序完成后会被交换到数组的第一个位置,此时printf读取第一个字符就碰到终止符,自然输出空白。
而你写的逐字符打印循环是按数组总长度遍历所有下标,不管'\0'在什么位置都会打印对应位置的字符,首位的'\0'是不可见字符不会显示,但后面存储的有效字符会被正常输出,所以你能确认数组里存了有效数据。
修复方案
调整两层排序循环的边界,只对'\0'之前的有效字符做排序,不要移动终止符的位置即可,修改后的排序循环代码如下:
char temp; for (int i = 0; i < size - 1; i++) { for (int j = i + 1; j < size - 1; j++) { if (tolower(buff[i]) > tolower(buff[j])) { temp = buff[i]; buff[i] = buff[j]; buff[j] = temp; } } }
修改后'\0'会始终保留在数组末尾,此时调用printf("%s\n", buff)即可正常输出排序后的字符串。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

