我写了一个程序,将一个句子翻译成B1FF语言。当我输入消息并按回车键时,它不会使用特定的代码段给出任何输出。当我以特定方式编写代码时,我可以使其工作,但我选择以另一种方式编写它,这应该是相似的。你能解释一下为什么它不起作用吗?
这段代码适用于我的程序,我认为它与其他代码相似:
for(;(message[len] = getchar((( != '';) len++;
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define N 50
int main() {
char message[N];
int len=0;
printf("Enter message: ");
/*this is the part that is not working and i have no idea why. I
thought it's similar to the other code i provided*/
do {
message[len] = getchar();
len++;
} while (message[len] != 'n');
for(int i = 0; i < len; i++) {
switch(toupper(message[i])) {
case 'A': putchar('4'); break;
case 'B': putchar('8'); break;
case 'E': putchar('3'); break;
case 'I': putchar('1'); break;
case 'O': putchar('0'); break;
case 'S': putchar('5'); break;
default: putchar(toupper(message[i])); break;
}
}
printf("!!!!!!!!!!");
return 0;
}
关于示例代码的观察很少。这里
len++;
message[len] != 'n' /* at this stage message[len] contains Garbage not the valid char due to len++ */
len
在语句之前递增message[len] != 'n'
然后访问数组的len+1
字符会导致未定义的行为。为避免这种情况,您可以检查类似
message[len-1] != 'n'
接下来,message
数组不以空结尾。从循环端出来后,数组' '
.例如
message[len] = ' ';
最好的方法是在声明自身时初始化 char 数组。例如
char message[50] = {}; /* zeroed the whole array */