在%d之后使用带有空格的scanf(“%d”)

今天在我的c类中我遇到了scanf()命令,我们只是学习指针而且我们得到了一个问题,要求我们得到一个数组,然后在没有使用[]的情况下将其打印出来,除了声明(int)数组。 当然,这似乎是一块蛋糕,但不是你不小心写的时候:

scanf(“%d”,arr + i);

您是否注意到%d后的空格? 当然确实花了我一段时间来弄明白但是由于某些原因导致循环变得疯狂,我希望你们帮助我(和我的老师)弄清楚为什么会这样。 例:

#include  #define LEN 10 void arrayInput(int * arr, unsigned int len); void arrayReverseOutput(int * arr, unsigned int len); int main(void) { int arr[LEN] = { 0 }; arrayInput(arr, LEN); arrayReverseOutput(arr, LEN); system("pause"); return 0; } void arrayInput(int * arr, unsigned int len) { unsigned int i = 0; printf("Enter 10 numbers: "); for (i = 0; i = 0; i--) { printf("%d ", *(arr + i)); } } 

我真的好奇看看扫描器发生了什么……就好像它第一次运行时需要2个输入但是仍然设法将输入放在数组中的正确位置…感谢您的参与你的时间阅读<3

格式字符串中的空格告诉scanf()匹配零个或多个空白字符,直到匹配失败。 空格( ' ' ),换行符( '\n' ),回车符( '\r' )和制表符( '\t' )属于空格字符。 当格式字符串末尾出现空格时, scanf()将尝试匹配输入中的空白字符,直到找不到匹配项。 但是, scanf()只能在匹配失败或文件结束时返回。 因此,在如下声明的情况下:

 scanf("%d ", arr + i); 

scanf()的调用似乎会挂起,贪婪地等待来自用户的更多输入。 只要按下Enter键,就会发送换行符并由scanf()匹配,而scanf()仍在等待失败的匹配。 或者文件结束。 您可以通过Linux上的Ctrl-D或Windows上的Ctrl-C发出键盘文件结尾信号来转义此类循环。

使用空格终止scanf()格式字符串几乎总是错误的。 换行符( '\n' )也是一个空格字符,放置在格式字符串的末尾时具有相同的效果。

请注意,可以在scanf()格式字符串中有效地使用空格。 例如:

 int retval = scanf(" %c %c", &c1, &c2); 

这里,如果先前的IO操作在输入流中留下了换行符(并非罕见的发生),则前导空格会指示scanf()读取并忽略它。 格式字符串中的第二个空格告诉scanf()期望要转换的输入字符之间有零个或多个空白字符。 这允许用户输入具有插入空间的字符。 如果没有添加的空格,如果用户输入ab\n ,则c2最终将保留空格字符的值,并且b将留在输入流中以供下一个要拾取的IO操作。 另请注意, scanf()返回成功转换的次数,允许程序检查输入是否符合预期。 如果上述行中的retval不是2 ,则出现问题。