读取带空格的String,直到C中的新行

时间:2013-09-22 18:35:58

标签: string input output

我现在正处于泡菜中。我无法接受示例

的输入

1994 The Shawshank Redemption

1994年纸浆小说

2008黑暗骑士

1957年12个愤怒的男人

我首先将数字输入一个整数,然后我需要使用字符数组将Movie的名称转换为字符串,但是我无法完成此操作。

这是代码atm

while(scanf("%d", &myear) != EOF)
{
    i = 0;

    while(scanf("%[^\n]", &ch))
    {
        title[i] = ch;
        i++;
    }

    addNode(makeData(title,myear));
}

标题数组任意大,其功能是将数据作为节点添加到链表中。现在我为每个节点获得的输出如下

“hank Redemption”

“离子”

“骑士”

“男人”

是的,它奇怪地在截止标题前打印一个空格。我检查了变量,并在数据中添加了空格。 (我没有打印年份,因为这是正确的)

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您正在使用传递给scanf()的错误类型的参数 - 而不是扫描字符,请尝试立即扫描到字符串缓冲区。 %[^\n]扫描整个字符串,直至(但不包括)换行符。 只扫描一个字符。

(边际次要问题:我不知道你们从哪里得到scanf()在输入结束时返回EOF的想法,但事实并非如此 - 你会感觉更好阅读文档而不是做出错误的假设。)


我希望你现在看到:scanf()很难做对。这是邪恶的。为什么不一次输入整行,然后使用 sane 函数解析它?

char buf[LINE_MAX];

while (fgets(buf, sizeof buf, stdin) != NULL) {
    int year = strtol(buf, NULL, 0);

    const char *p = strchr(buf, ' ');
    if (p != NULL) {
        char name[LINE_MAX];
        strcpy(name, p + 1); // safe because strlen(p) <= sizeof(name)
    }
}