【问题标题】:Comparing string from FILE with other string将 FILE 中的字符串与其他字符串进行比较
【发布时间】:2018-05-04 15:38:24
【问题描述】:

我试图用 strcmp() 比较 2 个字符串。其中一个是通过键盘实现的,但另一个是从文件中扫描的,所以我使用fgets(vec[i].nombre,80,fentrada);,其中“vec”是来自 typedef 结构的向量,带有一个名为“nombre”的 char 变量。 问题是虽然我输入了从文件中获取的完全相同的字符串,但它不返回 0。我将最大字符限制为文件中字符串的长度,它使它工作,所以必须有一些东西与空格有关。但关键是让它适用于字符串的长度。

这是结构:

typedef struct f{
    int dia;
    int mes;
    int anno;
    };
typedef struct pelicula{
    char nombre[80];
    float nota;
    f fecha;
}peliculas;
peliculas vec[dim];

这是扫描文件中内容的句子。

FILE *fentrada=fopen("peliculas.dat","rt");
while(!feof(fentrada)){
    fgets(vec[i].nombre,80,fentrada);
    fscanf(fentrada,"%i",&vec[i].fecha.dia);
    fscanf(fentrada,"%i",&vec[i].fecha.mes);
    fscanf(fentrada,"%i",&vec[i].fecha.anno);
    fscanf(fentrada,"%f\n",&vec[i].nota);
    i++;
    printf("\n");
}

这是我比较字符串的地方:

int i=0,j=0;
char *nombre,cos[46],c[66];
strcpy(c,vec[i].nombre);
gets(cos);
printf("%s\n",c);
printf("%i",strcmp(cos,c));

这就是文件的样子:

Casa Blanca
4 11 2013
6
Mi villano favorito
5 11 2013
7
Crepusculo
6 11 2013
8

PD,我尝试使用 scanf(%s) 而不是 fgets,但它只扫描“Casa”,然后是“Blanca”,所以我得到 6 个元素而不是 3 个...

【问题讨论】:

标签: c string file struct


【解决方案1】:

可能的问题:

您使用fgets 从文件中读取的行包含换行符,但gets 不包含。也不建议使用feof(file)

解决办法:

使用fscanf 代替fgets。它返回一个整数值,表示有多少值与文件输入匹配。

fscanf 返回成功匹配和分配的输入项的数量,可以少于提供的数量,如果早期匹配失败,甚至为零。

代码:

只需更改扫描文件行的代码

int ret;
while(ret = fscanf(fentrada,"%[0-9a-zA-Z ] %d %d %d %d ", vec[i].nombre, &vec[i].fecha.dia, &vec[i].fecha.mes, &vec[i].fecha.anno, &vec[i].nota))
{
    if(ret == EOF)
    {
        break;
    }else
    {
        // printf("\n %d",ret);
        // ^ prints how many values are successfully matched
    }
}

注意:我已检查此代码以获取您的输入。它工作正常并返回 0 作为strcmp的输出

参考:fscanf - TutorialsPoint

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2013-05-06
    • 2017-02-20
    • 2010-10-06
    相关资源
    最近更新 更多