如何初始化只包含空格的字符串而根本没有垃圾?

我在代码中的目标是初始化具有80个字符的字符串,并且仅当用户键入不是'\0'' ''\t''\n'字符时。 打印“非法命令”。

现在,如果用户键入例如3个字符的空格并按Enter键。 输出为(80-4)= 76次“非法命令”。 并且它根本不需要打印它,因为用户输入的所有字符都是'\0'' ''\t''\n'

那个案子请帮帮我。

代码 :

 void main() { int i; char str[80]=""; gets_s(str, sizeof(str)); for (i = 0; i < 80; i++) { if ((str[i] != '\n' && str[i] != '\0' && str[i] != '\t' && str[i] != ' ')) { printf_s("illegal character: %c\n", str[i]); } } } 

产量

我在代码中的目标是初始化具有80个字符的字符串,并且仅当用户键入不是\ 0,,\ t,\ n的字符时。 打印“非法com

看来,如果用户只输入'\0'' ''\t''\n' ,则不会打印任何消息。

char str[80]=""; 指定初始化整个数组,但可能不是OP的问题。

然而,脚注1和评论可以解释OP的意外输出


这种挑战的原因是用户输入可能包含空字符 ,而不仅仅是附加的字符

使用getchar()将是一种直接的方法。

 int ch; while ((ch = getchar()) != '\n' && ch != EOF) { if (ch != ' ' && ch != '\t' && ch != '\0') { printf_s("illegal character code: %d\n", ch); } } 

gets_s(); 用于任务比较棘手,因为它不返回读取的长度,输入可能包含嵌入的空字符

要检测嵌入的空字符 ,缓冲区不会以'\n'结尾,并且希望(尽管未指定.1 )未使用的部分保持不变。 因此,通过预填充'\n'代码可以区分附加的空字符和读取的字符

 int main(void) { int i; char str[80]; memset(str, '\n', sizeof str); if (gets_s(str, sizeof str)) { int length = sizeof str; while (length > 0) { length--; if (str[length] == '\0') break; // found appended null character } for (int i=0; i 

我更喜欢getchar()方法。


1附加的空字符后缓冲区的值未指定为未更改 - 但这是常见情况。 嗯,但是如果它改变了,那就解释了OP的问题。 所以避免gets_s();另一个原因gets_s(); 这里。

当你说

 char str[80] = ""; 

看起来你实际上没有初始化所有80个字符。 您明确地将第一个字符初始化为'\0' ,但看起来您的编译器使用随机值将其他79保留。 (稍后会详细介绍这一点。)

当你说

 for (i = 0; i < 80; i++) 

你要求循环遍历数组中的所有80个字符 - 但这没有意义。 gets_s函数只填充一些字符 - 与用户键入的字符一样多,加上一个尾随'\0' 。 如果用户键入的字符数少于79个,则str中的许多字符仍未触及(并且可能仍然是随机的)。

尝试将循环更改为

 for (i = 0; str[i] != '\0'; i++) 

或者如果你想保持安全

 for (i = 0; i < 80 && str[i] != '\0'; i++) 

因为您的程序使用未初始化的内存,所以它在不同系统上的行为可能会有所不同。 当我在我的计算机上运行程序时,显然所有79都是0 ,这意味着我没有看到任何额外的错误消息。 (所以起初我无法理解你在说什么。)但是听起来,在你的系统中,它们实际上具有随机的非零值。 如果您将错误消息更改为,则可以看到此消息

 printf("illegal character: 0x%02x\n", str[i]); 

这将打印您看到的所有“非法”字符的(hex)表示。 我猜他们会或多或少随机数。

(正如chux在评论中指出的那样,你的编译器应该将其他79个字符初始化为0,所以听起来你的编译器可能是旧版本,并且在这方面也有错误。)

您可以尝试的另外两件事是:

  1. main()之外移动str[]的声明。 如果你这样做,所有这些都将被初始化为0,你的程序将表现得更像你期望的那样。

  2. str的声明更改为char str[80] = " ";""之间恰好有79个空格。

但这些变化都不是特别好的主意。 如果用户键入6个字符,您确实只想检查他明确键入的6个字符,而不是最初分配的所有80个字符。