【问题标题】:Converting lowercase to uppercase letters and printing them将小写字母转换为大写字母并打印它们
【发布时间】:2014-12-21 03:28:45
【问题描述】:

当我在同一个循环中转换并打印它时,我得到的结果加上一个我不知道它来自哪里的垃圾。 示例:

输入:

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�$(!

如果我在另一个循环中打印它就可以了:

输入:

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

【问题讨论】:

  • 更改为char array_ch[]={'A','B','C','D','E', '\0'};char array_ch[]="ABCDE";
  • 用 sizeof() 确定数组的大小并将其用于循环会更容易。

标签: c arrays loops


【解决方案1】:

你有未定义的行为。问题是你的循环: 它寻找 \0 并且没有。因此,如果您很幸运的话,您会发现问题在您认为正常的运行时会变得更糟,因为它看起来好像没问题,但只是一个等待发生的问题。

所以写:char array_ch[]={'A','B','C','D','E','\0'};你应该没事的

问候

【讨论】:

  • 为什么会发生这种未定义的行为?为什么找不到 '\0' 终止符?我必须知道为什么它会记住这个错误并从中吸取教训。
  • 好吧,你用字符填充数组,所以最后不会添加 \0。拥有 char “数组”的另一种方法是 Blupixy 使用 charwhat[] = { 'a', 'b'} 只是一个只有两个元素的数组,而 char something_else[] = “AB” 是一个数组三个元素最后一个是\0。恕我直言,最好不要搜索 \0 而是只循环到 #define LIMIT 3 for i = 0; i
  • @MorHaham ,当你写 char something[]="Something"; 时,\0 会自动提供,而如果你写 char something[]={'S','o','m','e','t','h','i','n','g'};\0 不会在最后提供。
  • 那么你怎么解释在第二个例子中当数组到达'\0'时循环停止了?
  • 我不能也不必这样做。因为我说的都是错的。未定义意味着一切都可能发生,如果碰巧它似乎有效。无论如何都很好。但这不会使未定义的行为消失。作为程序员,你只剩下一件事情了。不要编写未定义行为的程序。它迟早会追捕你,也许是几年后。查看流行程序中的各种安全问题.....
【解决方案2】:

该数组不是以空值结尾的,如果您打算使用该循环,则应自己插入一个终止符

char array_ch[] = { 'A', 'B', 'C', 'D', 'E', '\0' };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2013-07-26
    • 2011-06-01
    相关资源
    最近更新 更多