在%d之后使用scanf("%d")和空格

时间:2017-03-26 18:40:56

标签: c pointers scanf

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

  

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

你注意到%d之后的空格了吗?当然确实花了我一段时间来弄明白,但由于某种原因,使得循环变得疯狂,我希望你们帮助我(和我的老师)弄清楚为什么会发生这种情况。例如:

#include <stdio.h>
#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 < len; i++)
    {
        //printf("i = %d \n", i); see what happens when you use this line
        scanf("%d ", arr + i);
    }
}

void arrayReverseOutput(int * arr, unsigned int len)
{
    int i = 0;
    printf("The numbers in reverse order: ");
    for (i = --len; i >= 0; i--)
    {
        printf("%d ", *(arr + i));
    }
}

我真的很好奇看看扫描器发生了什么......好像它在第一次运行时需要2个输入但不知何故仍设法输入在阵列中的正确位置...... 感谢您抽出宝贵时间阅读本文&lt; 3

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

相关问题