C printf(“s”)工作不正常
所以我有一个大代码(所以不能把整个东西放在这里)。 但在某种程度上我有这个C printf(“s”)工作不正常,c,string,printf,C,String,Printf,所以我有一个大代码(所以不能把整个东西放在这里)。 但在某种程度上我有这个 while(ptr1!=NULL) { printf("%sab ",ptr1->name); puts(ptr1->name); ptr1=ptr1->next; } 现在,我的ptr1指向一个结构数组的一个条目(每个条目都是一个链表),该结构是从一个文件填充的 现在在这个循环中,它打印 FIRSTab FIRST SECONDab SECOND THIRD 为什么我的第三张不打印两次 如果我这样
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->name,“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++;
}
第三个字符串可能包含字符
third
,后跟\r
(回车)。它为什么包含这些内容只能通过了解文件的内容以及用户如何读取来确定
您可能正在使用单个换行符作为行终止符的系统上工作(但要打开的文件来自使用回车符和换行符对的系统),或者传递给您的文件指针(fp
)是以二进制模式打开的
如果无法更改要在文本模式下打开的文件指针,则快速修复方法可能是将此条件
while(string[j]!='\n')
更改为while(string[j]!='\n'&&string[j]!='\r')
,尽管您可能需要一个处理多个空白字符的更健壮的解决方案。如何获得第三个/code>?是否以0结尾?是否确定ptr1->name
以'\0'
结尾?这不是真正的代码。请给我们真正的密码,你可以在那串里找到鱼。尝试将您的输出重定向到一个文件,并用十六进制编辑器打开它,以查看具体内容。ptr
和ptr1
都在实际代码中吗?@Kraken:这完全取决于您。以文本模式打开文件:fopen(“任意”、“r”)
;注意“r”
,而不是“rb”
。fp是fp=fopen(“file.txt”,“r”)代码>@CharlesBailey谢谢,现在可以用了。不管怎样,我还是解决了这个问题?为什么“\n”不起作用?@Kraken:你的程序运行在什么操作系统上?你的文本文件是从哪里来的?