所以我有这个大代码(所以不能把整个事情放在这里)。 但在某一点上,我有这个。
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++;
}
答案 0 :(得分:3)
您的第三个字符串可能包含字符THIRD
,后跟\r
(回车)。为什么它包含这个只能通过了解文件的内容以及如何阅读它来确定。
您可能正在使用一个使用单个换行符作为行终止符的系统(但是您打开的文件来自使用回车符和换行符对的系统)或者该文件指针你被传递(fp
)是以二进制模式打开的。
如果您无法更改要在文本模式下打开的文件指针,那么快速修复可能将此条件while(string[j]!='\n')
更改为while(string[j]!='\n' && string[j] != '\r')
,尽管您可能想要一个处理多个空格字符的更强大的解决方案。