String 读一个带空格的字符串,直到在C中读到新行

String 读一个带空格的字符串,直到在C中读到新行,string,input,output,String,Input,Output,我现在正处于困境中。我在输入示例时遇到问题 1994肖申克的救赎 1994年低俗小说 2008黑暗骑士 1957年12愤怒的男人 我首先将数字转换成整数,然后我需要使用字符数组将电影的名称转换成字符串,但是我还没有完成这项工作 这是atm机的代码 while(scanf("%d", &myear) != EOF) { i = 0; while(scanf("%[^\n]", &ch)) { title[i] = ch; i

我现在正处于困境中。我在输入示例时遇到问题

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));
}
标题数组任意大,其功能是将数据作为节点添加到链接列表中。现在,我为每个节点得到的输出如下

“汉克赎罪”

“离子”

“骑士”

“男人”

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


如何修复此问题?

您使用了传递给
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)
    }
}
charbuf[LINE_MAX];
while(fgets(buf,sizeof buf,stdin)!=NULL){
int year=strtol(buf,NULL,0);
常数char*p=strchr(buf',);
如果(p!=NULL){
字符名称[LINE_MAX];

strcpy(name,p+1);//安全,因为strlen(p)现在发生了一件奇怪的事情将名称复制到所有节点中,因此我会丢失每个节点中的名称数据。每个节点的年份保持不变,但名称会一直更改为最近读取的名称in@MagicalToast这是使用指向同一内存缓冲区的指针的典型症状。请记住:数组不是指针。@MagicalToast您必须分配一个单独的数组为列表中的每个节点指定y。