问题描述
我对C还是很陌生。我想填充一个2d数组,其中使用字符串作为输入填充每一行。 我当前的解决方案如下:
char word[2][100]
for (int i = 0; i < 2; i++) {
scanf(" %[^\n]",word[i]);
}
我通常理解%[^ \ n]指示符,但不理解为什么要在其之前需要空格才能起作用。
当我尝试对%s执行相同操作时,事情开始变得怪异。
char word[2][100]
for (int i = 0; i < 2; i++) {
scanf("%s",word[i]);
}
它允许3个输入而不是2个输入并使程序崩溃。
解决方法
"%s"
会跳过前导空格,即使没有前导" "
,例如' '
和前一行的'\n'
也由于 Enter 而跳过。
" %[^\n]"
也会由于" "
而跳过前导空格,否则不会。然后,它会寻找非'\n'
输入。
这两个都是坏,因为它们缺乏宽度控制,而且都无法正确读取行。
请考虑避免使用scanf()
并使用fgets()
。
char word[2][100] = { 0 };
for (int i = 0; i < 2; i++) {
char buffer[100 + 1];
if (fgets(buffer,sizeof buffer,stdin) == NULL) break;
buffer[strcpsn(buffer,"\n")] = '\0'; // lop off potential trailing \n
strcpy(word[i],buffer);
}
还有其他一些问题,但有一些可以启动OP的问题。