C如何正确使用sscanf支持

C如何正确使用sscanf支持,c,scanf,enter,C,Scanf,Enter,我目前正在学习阅读C语言的文件。 总之,直截了当地说: 文本文件内容: 123456 James Doakes; 0 987987 Dexter Morgan; 0 010203 Masuka Perv; 0 我写这篇文章是为了检查James Doakes的名字是否正确注册: printf("%s", ownerName); 但当它打印出来的时候,就像标准输出仍然处于活动状态,我可以按Enter键,它会再次键入名称。我的目标当然是能够将数字、全名和最后一个数字作为单独的变量进行统计。但它显

我目前正在学习阅读C语言的文件。 总之,直截了当地说:

文本文件内容:

123456 James Doakes; 0
987987 Dexter Morgan; 0
010203 Masuka Perv; 0

我写这篇文章是为了检查James Doakes的名字是否正确注册:

printf("%s", ownerName);
但当它打印出来的时候,就像标准输出仍然处于活动状态,我可以按Enter键,它会再次键入名称。我的目标当然是能够将数字、全名和最后一个数字作为单独的变量进行统计。但它显然不起作用。我猜a\n也会注册。不知道,我只是在猜测

我做错了什么?为什么?我该如何解决这个问题

非常感谢, Mif

表示以空格、可选空格、非
字符序列结尾的字符串,可选空白,然后是数字

您似乎没有扫描实际的
字符本身,以便在尝试获取数字时,
将导致其失败。您可以通过以下方式看到这一点:

#include <stdio.h>

#define ACCOUNTNRSIZE 100
#define NAMESIZE 100

int main (void) {
    char accountNr[ACCOUNTNRSIZE], ownerName[NAMESIZE], enter[3];
    int accountBalance = 0;
    char filename[] = "breg.txt";
    FILE *file = fopen(filename, "r");
    if (file != NULL) {
        char line[128];
        while (fgets(line, sizeof(line), file) != NULL) {
            int count = sscanf(line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance);
            printf ("%d [%s] [%s] [%d]\n", count, accountNr, ownerName, accountBalance);
        }
        fclose(file);
    } else {
        perror(filename);
    }
    return 0;
}
事实上,即使您将
breg.txt
文件更改为:

123456 James Doakes; 314159
987987 Dexter Morgan; 271828
010203 Masuka Perv; 42
由于扫描仅成功读取两个项目,因此帐户余额仍将获得
0


无论何时使用
scanf
-系列功能之一,都应检查返回代码以确保其扫描的项目数正确,如:

int count = sscanf (line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance);
if (count != 3) {
    fprintf (stderr, "Catostrophic failure, count is %d\n", count);
    return 1;
}
这里的修复相对简单,只需使用
%s%[^;];%d
作为格式字符串

通过该更改,您看到的输出是:

3 [123456] [James Doakes] [314159]
3 [987987] [Dexter Morgan] [271828]
3 [010203] [Masuka Perv] [42]

请记住,在
%d
之前实际上不需要空格(尽管它不会造成伤害)。该特定格式说明符在尝试扫描数字之前跳过空白。

尝试
sscanf(行,“%s%[^;];%d”、accountNr、ownerName和accountBalance)或检查其返回值,
int r=sscanf(行,“%s%[^;];%d”、accountNr、ownerName和accountBalance);如果(r==3)/*accountNr、所有者名称和账户余额扫描成功*/如果(r==2)/*aaccountNr和所有者名称扫描成功*/如果(r==1)/*aaccountNr扫描成功*/其他/*未成功扫描任何内容:(*/
在打印所有者名称时也添加一个
'\n'
printf(“%s\n”,所有者名称)
完美。我昨天也意识到我可能走对了方向,但作为一个新手,你不知道问题出在哪里,因此你最终试图修复好代码,却认为它是坏代码。谢谢!
123456 James Doakes; 314159
987987 Dexter Morgan; 271828
010203 Masuka Perv; 42
int count = sscanf (line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance);
if (count != 3) {
    fprintf (stderr, "Catostrophic failure, count is %d\n", count);
    return 1;
}
3 [123456] [James Doakes] [314159]
3 [987987] [Dexter Morgan] [271828]
3 [010203] [Masuka Perv] [42]