这段代码用'\n'来存储输入的值,这不能让它与另一个有相同输入但没有'\n'的字符串相匹配。

问题描述 投票:0回答:1

我正在尝试将用户输入的字符串与文件中的字符串进行匹配。但是有两件事情是不正确的。

typedef struct
{
    int yyyy;
    int mm;
    int dd;
} Date;

int main()
{
    FILE *fp2;
    fp2=fopen("StudentId.txt","r");

    char input[255];
    char *id;
    id = (char *)malloc(sizeof(Date));

    printf("Enter your UserId:\n");
    gets(id);
    gets(id);
    fgets(input,sizeof(input),fp2);
    int cmp;
    printf("%s_\n%s_\n",input,id );
    return 0;
}

首先,我必须使用两个get(id)而不是一个,因为程序似乎跳过了第一个。第二,在得到存储后的打印结果是这样的

Aditya828
_Aditya828_

这让我很奇怪,为什么它存储的输入是'\n',而id却不是。有什么办法解决这个问题吗?

c gcc file-handling
1个回答
1
投票

为什么它存储的是 input 带着 '\0'id 不。

这个结论曲解了结果。

两种 idinput 结尾处有一串 null chracter '\0'. input 也有 '\n' 作为 fgets() 保留线路进给。 gets() 不保留。

有什么办法可以解决这些问题吗?

避免 gets(). 它是 坏的.

而不是使用 fgets() 阅读 id.

使用一个缓冲区,其大小基于文本重排,即 id,而不是尺寸的大小 Date. 慷慨一点

#define ID_MAX_SIZE 40    // Expected max size
char id[ID_MAX_SIZE * 2]; // Be generous.  Later code can trucate if needed.

if (fgets(id, sizeof id, stdin)) {
  id[strcspn(id, "\n")] = '\0'; // Lop off potential \n
  printf("id: <%s>\n", id);
}
© www.soinside.com 2019 - 2024. All rights reserved.