【问题标题】:Code that isn't scanning everything correctly无法正确扫描所有内容的代码
【发布时间】:2011-05-24 02:39:46
【问题描述】:

我应该得到一个文件并扫描信息。当我尝试将其打印出来时,我扫描的大部分信息都会丢失或被截断。这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct profile {

    char gender;
    float soc;
    char name[20];
    char name2[20];
    int age;
    char job[20];
    float income;
    char M_hob[20];
    char m_hob[20];
    int height;
    int weight;
    char relig[20];
} PROFILE;

int main(void)
{

    int i, count;
    char file[30], ssn[10];
    FILE *fin;
    PROFILE members[50];

    printf("SSN: ");
    scanf("%s", ssn);
    printf("Name of file of records: ");
    scanf("%s", file);

    fin = fopen(file, "r");

    if ((fin == NULL)) {
        printf("Can't Open File");
        exit(1);
    }

    i = 0;
    while (fscanf(fin, "%c", &members[i].gender) != EOF) {

        fscanf(fin, "%f", &members[i].soc);
        fscanf(fin, "%s", members[i].name);
        fscanf(fin, "%s", members[i].name2);
        strcat(members[i].name, members[i].name2);
        fscanf(fin, "%d", &members[i].age);
        fscanf(fin, "%s", members[i].job);
        fscanf(fin, "%f", &members[i].income);
        fscanf(fin, "%s", members[i].M_hob);
        fscanf(fin, "%s", members[i].m_hob);
        fscanf(fin, "%d", &members[i].height);
        fscanf(fin, "%d", &members[i].weight);
        fscanf(fin, "%s", members[i].relig);
        fscanf(fin, "%c", &members[i].space);

        i++;
    }
    fclose(fin);

    count = i;
    for (i = 0; i <= count; i++) {
        printf("%c\n", members[i].gender);
        printf("%.0f\n", members[i].soc);
        printf("%s\n", members[i].name);
        printf("%d\n", members[i].age);
        printf("%s\n", members[i].job);
        printf("%.0f\n", members[i].income);
        printf("%s\n", members[i].M_hob);
        printf("%s\n", members[i].m_hob);
        printf("%d\n", members[i].height);
        printf("%d\n", members[i].weight);
        printf("%s\n", members[i].relig);
    }

    return 0;
}

我正在扫描的两段:

M
111223333
Rob Low
47
Actor
1000000
Dancing
Painting
63
165
Atheist

M
123456789
Bob Mitchell
77
Driver
25000
Baseball
Cooking
72
275
None

以及打印出来的部分内容:

M
111223336
Rob
47
Actor
1000000
Dancing
Painting
63
165
Atheist

0
M
0
Bob
0
Mitchell
77
0
0
Driver
2
5000
Baseball
72
275
0
ne

你可以看到第一个被完美地扫描,但其余的都是错误的。

【问题讨论】:

  • 请查看输出并确保我在第一条和第二条记录之间正确放置了一个空行。
  • 对于初学者来说,这将导致一个问题for (i = 0; i &lt;= count; i++) { 它应该是从 i=0 到 i
  • @judda,这有点帮助,但它仍然输出奇怪/不完整的结果

标签: c loops struct scanf


【解决方案1】:

如果必须使用fscanf(),请检查每个返回值。

担心循环前面的%c 在第二个循环中获得换行符或附近。

您最好将每一行读入一个大字符串,然后对其应用sscanf()。这至少避免了对换行符的混淆。 (由于他们处理换行符的方式,我不会用 bargepole 触摸 scanf()fscanf() - 或者不是。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2020-11-07
    • 2023-01-03
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多