fscanf()匹配C中的字符串

fscanf()匹配C中的字符串,c,pointers,scanf,C,Pointers,Scanf,我有一个这样的文件: X1034Example X1234Example2 Y2934Example3 FILE **fp; if ((*fp = fopen(fileName, "r")) == NULL) { printf("Unable to read file: %d: %s\n", errno, strerror(errno)); exit(1); } int id; char label[64]; fscanf(*fp, "X%4d%s", &id, la

我有一个这样的文件:

X1034Example
X1234Example2
Y2934Example3
FILE **fp;
if ((*fp = fopen(fileName, "r")) == NULL) {
    printf("Unable to read file: %d: %s\n", errno, strerror(errno));
    exit(1);
}

int id; char label[64];
fscanf(*fp, "X%4d%s", &id, label)
假设我已打开该文件并将其加载到
*fp
,我现在想匹配如下行:“X”后跟4位数字,后跟任意字符串,所以我假设如下:

X1034Example
X1234Example2
Y2934Example3
FILE **fp;
if ((*fp = fopen(fileName, "r")) == NULL) {
    printf("Unable to read file: %d: %s\n", errno, strerror(errno));
    exit(1);
}

int id; char label[64];
fscanf(*fp, "X%4d%s", &id, label)
但是,这无法正常工作,对于我使用此代码段测试的指定文件:

fscanf(*fp, "X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);

fscanf(*fp, "X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);
我得到的结果是

1
Example
1
Example
这仅仅是由于指针的不确定性行为,还是我做错了什么

编辑1

因此,在X之前添加空格修复了第一个问题,但现在我才意识到一些标签中有空格

例如:

X1245Example Text Here

fscanf(*fp, " X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);
应产生:

1245
Example Text Here
这仅仅是由于指针的不确定性行为,还是我做错了什么

fscanf(*fp,“X%4d%s”,&id,label)
不会消耗上一行的剩余
'\n'
。请参阅提示:。第二个
fscanf()
simple失败,未更新
id,标签
。如果代码检查了
fscanf()

使用
fscanf(*fp,“X%4d%s”和&id,标签)
(添加空格),或者更好的方法是,对行进行
fgets()
编码,然后对行进行
sscanf()
检查扫描的返回值

int id; char label[64];
char buffer[sizeof label * 2];  // form a generous buffer

if (fgets(buffer, sizeof buffer, stdin)) {
  if (sscanf(*fp, "X%4d%63s", &id, label) == 2) {
    printf("%d\n", id);
    printf("%s\n", label);
  } else {
    Failed();
  }
}
要读取行的其余部分,而不是
“%s”
,请执行以下操作:

if (fgets(buffer, sizeof buffer, stdin)) {
  if (sscanf(*fp, "X%4d%63[^\n]", &id, label) == 2) {
    printf("%d\n", id);
    printf("<%s>\n", label);  // added <> to help denote spaces
if(fgets(buffer,sizeof buffer,stdin)){
如果(sscanf(*fp,“X%4d%63[^\n]”,&id,标签)=2){
printf(“%d\n”,id);
printf(“\n”,label);//添加以帮助表示空格

当与
fscanf()
和朋友发生问题时,请执行步骤1。测试并报告其返回值。例如
if(fscanf(*fp,“X%4d%s”,&id,label)!=2)报告错误();
什么是
fp
?它是
文件**
?请尝试创建一个显示给我们。作为有关问题的提示,
%s
格式跳过(可能的)前导空格,而不是尾随空格。因此,请考虑文件中每一行的结尾。当
*fp
stdin
时,在我的机器上运行良好。例如,如果标签字符串中有空格,您会在其中执行什么操作?即
X1242示例编号2
?@Ollu_u注释不清楚。最好在问题中发布示例输入,然后这是我想要的结果。我的意思是什么