0

我的文件具有以下模式。

word1 word2 word3
wordzz word33 word2431 word341

等等。

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

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

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

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

ptr1指向任何链表头部的 ptr 在哪里。(比如第 1 行)
名称字段是名称,即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;
    }

}

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

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

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

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

4

1 回答 1

2
printf("\n%s",ptr1->name); // Problem

stdout当连接到终端时,默认情况下是行缓冲的,您必须刷新流才能打印字符串。fflush(stdout)printf调用 flush之后使用stdoutstdout当流被行缓冲时,打印新行字符也将刷新。

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

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

于 2012-03-04T10:00:38.340 回答