如何初始化只包含空格的字符串而根本没有垃圾?
我在代码中的目标是初始化具有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,所以听起来你的编译器可能是旧版本,并且在这方面也有错误。)
您可以尝试的另外两件事是:
-
在
main()
之外移动str[]
的声明。 如果你这样做,所有这些都将被初始化为0,你的程序将表现得更像你期望的那样。 -
将
str
的声明更改为char str[80] = " ";
,""
之间恰好有79个空格。
但这些变化都不是特别好的主意。 如果用户键入6个字符,您确实只想检查他明确键入的6个字符,而不是最初分配的所有80个字符。