我想从文件中读取信息,并将文件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: %s\n", 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=%s\n", zahla, zahlb);
}
文件内容为:
a=10 b=5
答案 0 :(得分:2)
格式说明符"%^"
毫无意义,实际上不会做任何事情-因此,您永远不会在zimu
数组中得到任何内容。
格式说明符中s
之后的%[1-9]
表示“匹配文字'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?
}
%[
和%c
以外的格式说明符也会跳过空格,并且如果不这样做,则可以忽略结尾的内容关心它。如果您确实关心尾随的东西,则可以使用%n
检查扫描的字符数以确保它是整行。%s
和%[
标识符上使用边界读入固定数组以确保它们不会溢出。答案 1 :(得分:0)
关于%[abc]
格式字符串中的scanf
扫描集存在一些混淆:您应指定要读取的最大字符数,并指定[
和{{1 }}。 ]
之后没有尾随的s
。格式字符串中的多余空格会导致空格被跳过。
这是您的代码的更正版本。
]