【问题标题】:puts displays but %s does notputs 显示但 %s 不显示
【发布时间】:2012-03-04 09:31:18
【问题描述】:

我的文件具有以下模式。

word1 word2 word3
wordzz word33 word2431 word341

等等。

现在我在一个结构数组中读取整个文件,数组的每个条目维护文件每一行的链表。

现在整个代码有点难以解释,但这就是问题所在。

当我尝试执行以下操作时,在特定的地方

printf("\n%s",ptr1->name);
puts(ptr1->name);

其中ptr1 是指向任何链表头部的ptr。 (比如第 1 行)
name 字段是名称,即word1,word2 etc. 现在输出是

word1word1
word2word2
word3

为什么word3 没有被打印两次? 这整个问题甚至阻止我strcmp 列表的最后一个字。

请帮忙。

附言

当我这样做时

printf("%d",ptr1);

它为ptr 打印三个不同的值,它们都不是NULL

我有两个结构相同的相似数组。我使用相同的函数来填充这两个数组。现在

    node* ptr,*ptr1; 
ptr=first[i].ptr;
ptr1=second[i].ptr;
while(ptr!=NULL) 
{
printf(" \n1");
printf(" %s", ptr->name); // Works Fine
if(!strcmp(ptr->name,"string")) 
    {


    while(ptr1!=NULL)
    {
        printf("A %s ",ptr1->name);// Problem
                    fflush(stdout);  // EDITS AS ASKED BY USER `pmg`
                    puts(ptr1->name);       
                if(!strcmp(ptr1->name,strt))
        {
            printf("\n 4\n");
            return 1;
        }
        else
        {
        ptr1=ptr1->next;
        }
    }
    return 0;


    }
else 
    {
    ptr=ptr->next;
    }

}

我为什么在提到的地方遇到问题,而不是在“工作正常”的地方。

工作正常,我显示所有节点(名称)但在问题点我没有显示姓氏。

但如果我确实提出了问题,它也会显示该名称。

如果在此代码 sn-p 之前,我仅使用 printf 打印第二个数组。它确实打印每个节点(名称)。 谁能告诉我为什么以后不打印?

【问题讨论】:

  • 根据您的代码,适用于 word2 的代码没有理由适用于 word3。你可能忽略了一些重要的事情。
  • 您正确地发现了有问题的行:printf("\n%s",ptr1->name);。将换行符放在输出字符串之前只是一个坏习惯。始终将一行视为以“\n”结尾并相应地组织您的代码。
  • @Jens Gustedt 这没有多大帮助,也许我不明白你想说什么。但对我来说问题是printf("%s",ptr->name); 不会为我打印最后一个字。
  • 您是否在循环中错过了对ptr1 的分配(为新的prt 重新初始化)?
  • @pmg no ptr1 将指向与循环之前相同的列表。它确实打印了三个中的两个,并且只留下了最后一个,你把三个都打印出来了。另外,我无法得到 strcmp 的正确答案,因为我想与列表的姓氏进行比较,但它不会给我正确的答案。

标签: c string puts


【解决方案1】:
printf("\n%s",ptr1->name); // Problem

stdout 在连接到终端时默认为行缓冲,您必须刷新流才能打印字符串。在printf 调用之后使用fflush(stdout) 来刷新stdout。当流被行缓冲时,打印一个换行符也会刷新stdout

puts 不需要额外的换行符,因为puts 总是在输出中附加一个换行符。

正如@JensGustedt 在问题评论中提到的那样,将新行放在字符串之前是一个坏习惯“将一行视为由'\n' 终止并相应地组织您的代码。”

【讨论】:

  • 不,它仍然对我不起作用。如果我做printf(" A %s",ptr1->name);,那么我得到的只是A(最后一个)。虽然puts 打印正确。
  • @Kraken 你在我的回答中写了printf(" A %s",ptr1->name); fflush(stdout); 吗?
  • 如果我写printf("A %s ",ptr1->name); fflush(stdout); puts(ptr1->name);,那么我得到输出A otherModules otherModules A DRIVERDEF DRIVERDEF ENDD,因为我的三个词是otherModulesDRIVERDEFEND
  • @Kraken:您能否更新问题中的代码以包含 (fflush()) 和 puts() 调用?
  • 啊哈!您的 END 不是 3 个字符长。在最后一个'D' 之后有一些控制代码。看看吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多