我需要正确读取一行。空白区问题

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

我有一个用fscanf函数读取的输入文本。我可以阅读一些内容。但是,我无法读懂一句话。你能帮我吗?

我的input.txt:

54,Zeynep Kucuk,62-46-59 
62,Osman Buyuk 
46,Gulay Er,25-23-32-1

我可以读第一行和第三行。但我对第二行有一些问题,因为它的第三个位置是空的。

但如果输入如下,我肯定能读到

54,Zeynep Kucuk,62-46-59 
62,Osman Buyuk,0
46,Gulay Er,25-23-32-1

0表示Osman Buyuk没有朋友。

我的代码的一部分在下面

int id;
char name[100];
char friends[100];
FILE *dosya = fopen("input.txt", "r");
struct node *root = NULL;
while (fscanf(dosya, "%d,%[^,],%s,%[^,],%s\n", &id, name, friends) == 3) {
    root = insertNewUser(root, id, name, friends);
}

在向树添加我的数据并打印后,预期输出为:

31,NAME1 SURNAME1,16-23-45-3
21,NAME2 SURNAME2
10,NAME3 SURNAME3,12-31-1-5
c scanf
1个回答
0
投票

要跳过行中的第二个和第四个项目,必须在*之前传递赋值抑制字符[

fscanf(dosya, "%d,%*[^,],%s,%*[^,],%s\n", &id, name, friends)

另请注意,%s将停留在空格上:您可能希望使用%[^,]代替name%[^\n]代替friend,您不应该使用\n读取尾随换行符,它将读取任何待处理的空格,而是%*1[\n]%c来读取尾随字节。还强烈建议将最大字符数存储到目标数组中,以避免无效输入上的未定义行为。

最后,如果你需要处理缺少部分的行,最好用fgets()一次读取一行文件并用sscanf()解析数组。

以下是代码片段的修改版本:

int id;
char buf[1024];
char name[100];
char friends[100];
FILE *dosya = fopen("input.txt", "r");
struct node *root = NULL;
while (fgets(buf, sizeof buf, dosya)) {
    *friends = '\0';
    int n = fscanf(dosya, "%d,%*[^,],%99[^,],%*[^,],%99[^\n]", &id, name, friends);
    if (n >= 2)
        root = insertNewUser(root, id, name, friends);
}
© www.soinside.com 2019 - 2024. All rights reserved.