【问题标题】:Why doesnt getchar() stop reading strings in C?为什么 getchar() 不停止读取 C 中的字符串?
【发布时间】:2015-03-04 01:37:48
【问题描述】:

我希望用户能够输入一个数字 n,然后程序将从用户那里读取 n 个字符串。但是现在程序不会停止读取字符串了。

#include <stdio.h>

#define STRING_MAX 10

int main (void)
{
    char string[STRING_MAX];
    int count;
    int total;
    int n, i;
    int chr;

    scanf("%d", &n);

    for(i=0; i<n; i++)
    {
        do {
            count = 0;
            total = 0;
            while ((chr = getchar() != EOF)&& (chr != '\n'))
            {
                if (count < STRING_MAX - 1)
                    string[count++] = chr;
                total += 1;
            }
            string[count] = '\0';
        } while (total > STRING_MAX - 1);
        printf("The input string was:\n\t%s\n", string);
    }
    return 0;
}

【问题讨论】:

    标签: c string input scanf getchar


    【解决方案1】:

    因为这里有运算符优先级问题

    chr = getchar() != EOF
    

    这被评估为

    chr = (getchar() != EOF)
    

    因为!=运算符有higher precendence而不是赋值运算符=,所以你只需要像这样添加括号

    (chr = getchar()) != EOF
    

    提示:在访问n 之前检查来自scanf() 的返回值,因为如果输入无效,您将尝试在未初始化时使用n,这会导致未定义的行为。

    【讨论】:

    • 我更改了括号,但仍然存在另一个问题,第一个 getchar 被跳过。所以如果我输入 2,它只会读取 1 个字符串。我认为 scanf 将换行符留在输入流中跨度>
    • @Yiannis 你是对的,scanf() 确实在输入流中保留了换行符,只需使用getchar() 进行循环,直到在开始另一个循环之前将其从流中删除。
    • 什么样的循环?循环中应该有什么条件?
    • @MattMcNabb 绝对正确 chr 应该在循环外声明。
    • 正如@MattMcNabb 指出的do {int chr = getchar();} while ((chr != EOF) &amp;&amp; (chr != '\n')); 应该是int chr; do {chr = getchar();} while ((chr != EOF) &amp;&amp; (chr != '\n'));
    猜你喜欢
    • 2020-07-30
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多