c语言 - 如何使用函数 sscanf 读取特定字符?



我想从文件中读取信息,并将文件中a的值提供给"a",将b的值提供给"b"。但它没有用。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
FILE *fp;
char buffer[1024];
char zahla[128];
char zahlb[128];
char zimu[128];
fp = fopen("./0312.conf", "r");
if (fp == NULL) {
perror("error");
return (-1);
}
while (fgets(buffer, 1024, fp) != NULL) {
sscanf(buffer, "%^", zimu);
printf("zimu is: %sn", zimu);
if (strcmp(zimu, "a") == 0) {
sscanf(buffer, "%[1-9]s", zahla);
}
if (strcmp(zimu, "b") == 0) {
sscanf(buffer, "%[1-9]s", zahlb);
}
}
printf("a=%s, b=%sn", zahla, zahlb);
}

文件内容为:

a=10 b=5
  • 格式说明符"%^"毫无意义,实际上不会做任何事情——所以你永远不会在zimu数组中获得任何东西。

  • 格式说明符中%[1-9]后的s表示"匹配文字's'字符",因此永远不会匹配。 您可能只想删除它。

  • 由于您的输入行以a=b=开头,"%[1-9]"格式说明符将不匹配。

很可能你想要的是这样的

char name[100], value[100];
if (sscanf(buffer, " %99[a-z] = %99[0-9]", name, value) == 2) {
// matched a line with name=value, do something with it
} else {
// didn't match -- give an error?
}
  • 使用格式中的空格字符跳过空格 - 只要有空格,它就会跳过 0 个或多个空格字符。 注意 0 -- 不需要空格,可以有任意数量的空格
  • 始终检查返回值以查看预期的项目数是否匹配
  • 你需要格式中的东西来匹配行上的所有字符,尽管除了%[%c以外的格式说明符也会跳过空格,如果你不关心它,你可以忽略尾随的东西。 如果您确实关心尾随内容,您可以使用%n来检查您扫描了多少个字符,以确保它是整行。
  • 在读取固定数组的%s%[说明符上使用边界,以确保它们不会溢出。

scanf格式字符串中的扫描集%[abc]存在一些混淆:您应该指定要读取的最大字符数,并给出[]之间的字符范围。]之后没有尾随s。格式字符串中多余的空格会导致跳过空格。

下面是代码的更正版本。

#include <stdio.h>
#include <string.h>
int main() {
FILE *fp;
char buffer[1024];
char zimu[128];
char zahla[128];
char zahlb[128];
fp = fopen("./0312.conf", "r");
if (fp == NULL) {
perror("error");
return -1;
}
zahla[0] = zahlb[0] = '';
while (fgets(buffer, 1024, fp) != NULL) {
if (sscanf(buffer, " %127[a-z]", zimu) != 1)
continue;
printf("zimu is: %sn", zimu);
if (strcmp(zimu, "a") == 0) {
sscanf(buffer, " a = %127[1-9]", zahla);
}
if (strcmp(zimu, "b") == 0) {
sscanf(buffer, " b = %127[1-9]", zahlb);
}
}
printf("a=%s, b=%sn", zahla, zahlb);
return 0;
}

最新更新