我想从文件中读取信息,并将文件中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;
}