被错误地读入数组的东西

时间:2012-10-26 04:25:55

标签: c arrays

我不确定我做错了什么,我做了类似的问题,但是读取数字并且它有效,这个程序假设要做的是在names.txt中读取此文档包含名称(last,first)< / p>

所以文字有

  

华盛顿,乔治

     

亚当斯,约翰

     杰斐逊,托马斯   等....

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

  

华盛顿,乔治

     

WAdams,GJohn

     

WAJefferson,GJThomas

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

#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;
}

我做错了什么?

1 个答案:

答案 0 :(得分:2)

first_nlast_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;