printf(“%s”)无法正常工作

时间:2012-03-10 12:02:15

标签: c string printf

所以我有这个大代码(所以不能把整个事情放在这里)。 但在某一点上,我有这个。

while(ptr1!=NULL)
{
printf("%sab ",ptr1->name);
puts(ptr1->name);
ptr1=ptr1->next;
}

现在我的ptr1指向一个结构数组的一个条目(每个条目都是一个链表),结构是从一个文件中填充的。

现在在这个循环中打印

FIRSTab FIRST
SECONDab SECOND
THIRD

现在为什么我的第三次没有打印出来?

如果我这样做

printf(" %s",ptr1->name); // i.e. one space before %s

我得到了

THIRDD

在%s之前放置2个空格给我

THIRDRD

3个空格给出

THIRDIRD

等等。

此外,如果我尝试做strcmp(ptr1->名称,“THIRD”),我将无法得到正确的THIRD比较。 为什么?

以下是我填充结构的方式。

// G is the structure, fp is passed as argument to function.
//THe file format is like this.
//FIRST SECOND THIRD
//NINE ELEVEN 
//FOUR FIVE SIX SEVEN
// and so on.
int i=0,j=0,k=0;
char string[100];
while(!feof(fp))
{
if(fgets(string,100,fp))
{
G[i].index=i;
k=0;j=0;
//\\printf("%d",i);
//puts(string);
node *new=(node*)malloc(sizeof(node));
new->next=NULL;
G[i].ptr=new;
node* pointer;
pointer=G[i].ptr;
while(string[j]!='\n')
{
    if(string[j]==' ')
    {
    pointer->name[k]='\0';

    k=0;
        node *new=(node*)malloc(sizeof(node));
        new->next=NULL;
        pointer->next=new;
        pointer=pointer->next;
        j++;
    }
    else
    {   
    pointer->name[k++]=string[j]; 
    j++; 
    }
}
pointer->name[k]='\0';
i++;
}

1 个答案:

答案 0 :(得分:3)

您的第三个字符串可能包含字符THIRD,后跟\r(回车)。为什么它包含这个只能通过了解文件的内容以及如何阅读它来确定。

您可能正在使用一个使用单个换行符作为行终止符的系统(但是您打开的文件来自使用回车符和换行符对的系统)或者该文件指针你被传递(fp)是以二进制模式打开的。

如果您无法更改要在文本模式下打开的文件指针,那么快速修复可能将此条件while(string[j]!='\n')更改为while(string[j]!='\n' && string[j] != '\r'),尽管您可能想要一个处理多个空格字符的更强大的解决方案。