字符串排序后使用printf("%s")无法输出的原因及解决方法
问题分析与解决:printf("%s")无法输出排序后的字符串
这个问题我之前也碰到过,其实核心是C语言字符串的结束标志规则在搞鬼!
为什么会出现这个问题?
C语言里的字符串是以**空字符'\0'**作为结束标记的,printf("%s", str)的工作逻辑是从数组起始位置开始逐个打印字符,直到遇到'\0'就停止。
看你的代码:
- 初始化
str时,编译器会自动在字符串末尾加上一个'\0'作为结束标志; - 但你排序时用了
sizeof(str)作为循环终止条件,而sizeof(str)计算的是整个数组的总长度(包括末尾的'\0'); - 因为'\0'的ASCII码是0,是所有字符中最小的,排序后它会被放到数组的第一个位置!
这样一来,printf("%s", str)一开始就碰到了'\0',直接停止输出,自然什么都看不到。而逐个字符打印是遍历整个数组,所以能输出所有字符(包括不可见的'\0')。
解决办法
只需要修改循环条件,让排序过程**不包含末尾的'\0'**即可,把两个for循环的终止条件从sizeof(str)改成sizeof(str) - 1:
#include <stdio.h> int main(void) { int i, j; char str[] = "Hello!! How are you?? I'm Fine. No Thank you.", temp; // 排除末尾的'\0',只排序有效字符 for (i = 0; i < sizeof(str) - 1; i++) { for (j = i + 1; j < sizeof(str) - 1; j++) { if (str[i] > str[j]) { temp = str[j]; str[j] = str[i]; str[i] = temp; } } } for(i = 0; i < sizeof(str); i++) printf("%c", str[i]); printf("\n"); // 换行区分两次输出 printf("%s", str); return 0; }
原理说明
sizeof(str) - 1代表数组中有效字符的数量(因为最后一位是编译器自动添加的'\0'),这样排序时只会处理实际的可见字符,'\0'会一直留在数组的最后位置,作为字符串的结束标志,printf("%s")就能正常遍历并输出所有排序后的字符了。
内容的提问来源于stack exchange,提问作者Ø Ø
相关产品推荐
相关产品推荐

