【问题标题】:Read a String with spaces till a new line in C读取带空格的字符串,直到 C 中的新行
【发布时间】:2013-09-22 18:35:57
【问题描述】:

我现在处于困境中。我无法输入示例

1994 年肖申克的救赎

1994 年低俗小说

2008 黑暗骑士

1957 12 愤怒的男人

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

这里是atm的代码

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

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

    addNode(makeData(title,myear));
}

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

“汉克救赎”

“离子”

“骑士”

“男人”

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

我该如何解决这个问题?

【问题讨论】:

    标签: string input output


    【解决方案1】:

    您使用了错误类型的参数传递给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)
        }
    }
    

    【讨论】:

    • 现在我发生了一件奇怪的事情。当我将数据插入节点时。 strcpy() 将名称复制到所有节点中,因此我丢失了每个节点中的名称数据。每个节点的年份保持不变,但名称不断更改为最近的读取
    • @MagicalToast 这是使用指向同一个内存缓冲区的指针的典型症状。记住:数组不是指针。
    • @MagicalToast 您必须为列表中的每个节点分配一个单独的数组。
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多