C如何正确使用sscanf支持
我目前正在学习阅读C语言的文件。 总之,直截了当地说: 文本文件内容: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键,它会再次键入名称。我的目标当然是能够将数字、全名和最后一个数字作为单独的变量进行统计。但它显
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]