2

我不确定我做错了什么,我做了一个类似的问题,但是通过读取数字并且它可以工作,这个程序应该做的是在 names.txt 中读取这个文档包含名称(最后一个,第一个)

所以文字有

华盛顿,乔治

亚当斯,约翰

杰斐逊、托马斯等……

我的程序读取了名称,但我的输出不正确,输出为:

华盛顿,乔治

WAdams, 约翰

WAJefferson, GJ托马斯

那么当它读取下一行时,它会保留前一个名字的第一个字母吗?

#include <stdio.h>

int main(void)
{

    char first_n[70]; 
    char last_n[70];
    
    int i=0;
    FILE *oput;
    FILE *iput;
    
    iput = fopen( "names.txt","r" );
    while ( fscanf( iput,"%s %s", &last_n[i],&first_n[i] ) !=  EOF )
    {
        i++; 
        printf("%s %s\n",last_n,first_n);
    }
        
    oput=fopen("user_name_info.txt","wt"); //opens output file
    fprintf(oput, "Last\t\tFirst\n------------\t-------------\n%s\t%s\n",last_n,first_n);
    
    return 0;
}

我究竟做错了什么?

4

1 回答 1

2

first_n并且last_n是字符数组(即认为单个字符串)

fscanf对待它们更像是你认为它们是一个字符串数组。您每次都在进一步读取字符串一个字符,即第一次将字符串放在偏移量 0 处,第二次将字符串放在偏移量 1 处...

尝试这个:

while ( fscanf( iput,"%s %s", last_n,first_n ) !=  EOF )
{
    i++; 
    printf("%s %s\n",last_n,first_n);
}

您的最终打印将仅打印最后读取的“记录”。也许你真的想要一个字符串数组?看起来有点像这样(我并不是说这是解决问题的最佳方法,但它符合您原始代码的精神......)

/* Limited to 20 names of 70 chars each */
char first_names[20][70]; 
char last_names[20][70];

int i=0;
FILE *oput;
FILE *iput;

iput = fopen( "names.txt","r" );
while ( fscanf( iput,"%s %s", &last_names[i],&first_names[i] ) !=  EOF )
{
    printf("%s %s\n",last_names[i],first_names[i]);
    i++;
}

oput=fopen("user_name_info.txt","wt"); //opens output file
i--; /* ensure i points to the last valid data */
while(i >= 0) { 
    fprintf(oput, "Last\t\tFirst\n------------\t-------------\n%s\t%s\n",last_names[i],first_names[i]);
    i--;
}
return 0;
于 2012-10-26T04:30:00.817 回答