如何在C编程中扫描两个或多个包含空格的字符串?

时间:2017-05-29 12:56:30

标签: c

我试图运行此代码,但它无法正常工作。任何人都可以告诉我这段代码有什么问题 收到第一个输入后,程序正在终止。

int main()
{
    char   name[100],college_name[100],address[100];
    printf("Enter your name :");
    scanf("%[^\n]s",name);
    printf("Enter college name :");
    scanf("%[^\n]s",college_name);
    printf("Enter address :");
    scanf("%[^\n]s",address);
}

1 个答案:

答案 0 :(得分:2)

您的scanf来电正确读取所有内容 - 但包括 - \n

问题是\n仍然在输入流上。因此,当第二个和第三个scanf调用运行时,它们什么都没找到。 (他们读取零个字符,但不包括下一个\n。)

最简单的解决方法是致电getchar()阅读并弃掉\n个字符:

#include <stdio.h>

int main()
{
    char name[100],college_name[100],address[100];
    printf("Enter your name :");
    scanf("%[^\n]",name);
    getchar();       /* discard \n */
    printf("Enter college name :");
    scanf("%[^\n]",college_name);
    getchar();       /* discard \n */
    printf("Enter address :");
    scanf("%[^\n]",address);
    getchar();       /* discard \n */
}

(我还删除了s来电中无关的scanf个字符。它是%[],而不是%[]s。)

现在,在一个层面上,这是一个糟糕的解决方案。从理论上讲,我们应该检查getchar()读取的字符实际上是\n。但是(a)在这种情况下它几乎必须是,并且(b)任何使用scanf读取用户输入的程序已经是kludgey且不可靠,因此添加一些kludgey并且可能不可靠(但很简单){{ 1}}通话不会让它变得更糟。

(有人会建议 - 一条评论甚至建议 - 调用getchar来摆脱无关的新行。这可能适用于某些平台,但它不能保证并且它赢了# 39;无处不在,所以这是一个更糟糕的解决办法。)

这里的真正教训是,不要像这样使用fflush(stdin)进行用户输入。不幸的是,在这样的开始程序中,用户输入显然是首选,因为它似乎如此简单方便。但事实证明(当你尝试制作实际有效的程序时)scanf实际上只是 方便,所以一旦你学到更多关于C的知识,您将完全放弃scanf,并使用更强大,更可靠的技术完成所有输入。 (您的下一个问题可能是,更可靠的技术是什么?一种是使用scanf读取用户输入行,然后根据需要操纵这些行。另请参阅http://c-faq.com/stdio/scanfprobs.htmlhttps://www.eskimo.com/~scs/cclass/notes/sx10h.html ,和https://www.eskimo.com/~scs/cclass/notes/sx12e.html。)