String 读一个带空格的字符串,直到在C中读到新行
我现在正处于困境中。我在输入示例时遇到问题 1994肖申克的救赎 1994年低俗小说 2008黑暗骑士 1957年12愤怒的男人 我首先将数字转换成整数,然后我需要使用字符数组将电影的名称转换成字符串,但是我还没有完成这项工作 这是atm机的代码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
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。