将小写字母转换为大写字母并打印它们

3
当我在同一个循环中转换并打印时,我会得到结果以及一个我不知道来自哪里的垃圾信息。 例如: 输入:
char array_ch[]={'A','B','C','D','E'};
int i=0;
for(i;array_ch[i]!='\0';i++){
  array_ch[i]=array_ch[i]+32;
  printf("%c",array_ch[i]);
}

输出:

abcde`H��A���/��u�$(!

And if I print it in another loop its ok:

Input:

char array_ch[]={'A','B','C','D','E'};
int i=0;
for(i;array_ch[i]!='\0';i++){
  array_ch[i]=array_ch[i]+32;
}


for(i=0;array_ch[i]!='\0';i++){
  printf("%c",array_ch[i]);
}
printf("\n");

输出:

abcde

2
更改为char array_ch[]={'A','B','C','D','E', '\0'};或者char array_ch[]="ABCDE"; - BLUEPIXY
使用sizeof()可更轻松地确定数组的大小并将其用于循环。 - mvw
2个回答

5
你的程序存在未定义行为。问题出在你的循环上: 它寻找一个 \0,但是没有找到。所以你只是侥幸发现了这个问题。对于那些看起来工作正常的运行,情况会更糟糕,因为虽然看起来没问题,但实际上只是等着出问题。
所以请写成:char array_ch[]={'A','B','C','D','E', '\0'}; 这样就可以了。
祝好!

为什么会出现未定义行为?为什么找不到 '\0' 终止符?我必须知道为什么它会发生,以便能够记住并从这个错误中学习。 - Mor Haham
你可以使用字符填充数组,这样\0就不会被添加在末尾。另一种创建字符“数组”的方法是像Blupixy所用的那样: char whatever[] = {'a','b'},它只是一个具有两个元素的数组,而char something_else[] = "AB"则是一个具有三个元素的数组,最后一个元素是\0。在我看来,最好不要搜索\0,而是循环到一定程度,例如 #define LIMIT 3 for i = 0; i < LIMIT, i++或类似的方式。 - Friedrich
@MorHaham,当你写char something[]="Something";时,\0会自动提供,而如果你写char something[]={'S','o','m','e','t','h','i','n','g'};,则末尾不会提供\0 - Spikatrix
那么你如何解释第二个例子中循环在数组到达 '\0' 时停止的呢? - Mor Haham
2
我不能也不必这样做。因为我说的每件事都是错误的。未定义意味着一切皆有可能,如果碰巧似乎可以工作,那就好得没话说。但这并不意味着未定义的行为会消失。作为程序员,你只有一件事要做:不要编写具有未定义行为的程序。它迟早会找上你,也许是几年后。看看流行程序中的各种安全问题... - Friedrich
我明白了,谢谢。 - Mor Haham

4
那个数组并没有以null结尾,如果你想要使用那个循环,你需要自己插入一个终止符号。
char array_ch[] = { 'A', 'B', 'C', 'D', 'E', '\0' };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接