我现在正处于泡菜中。我无法接受示例
的输入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”
“离子”
“骑士”
“男人”
是的,它奇怪地在截止标题前打印一个空格。我检查了变量,并在数据中添加了空格。 (我没有打印年份,因为这是正确的)
我该如何解决这个问题?
答案 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)
}
}