1

我现在正处于泡菜中。我无法输入示例

1994 肖申克的救赎

1994 年低俗小说

2008 黑暗骑士

1957 12 愤怒的男人

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

这是自动取款机的代码

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

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

    addNode(makeData(title,myear));
}

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

“汉克救赎”

“ 离子”

“骑士”

“男人”

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

我怎样才能解决这个问题?

4

1 回答 1

2

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

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


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

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)
    }
}
于 2013-09-22T18:42:40.930 回答