如何使用sscanf函数读取特定字符?

时间:2019-03-13 17:51:18

标签: c scanf

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

2 个答案:

答案 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?
}
  • 使用格式中的空格字符来跳过空格-只要有空格,它将跳过0个或多个空格字符。请注意0​​-不需要空格,并且可以有任意数量的空格
  • 始终检查返回值以查看预期的项目数是否匹配
  • 您需要某种格式的内容来匹配行上的所有字符,尽管%[%c以外的格式说明符也会跳过空格,并且如果不这样做,则可以忽略结尾的内容关心它。如果您确实关心尾随的东西,则可以使用%n检查扫描的字符数以确保它是整行。
  • %s%[标识符上使用边界读入固定数组以确保它们不会溢出。

答案 1 :(得分:0)

关于%[abc]格式字符串中的scanf扫描集存在一些混淆:您应指定要读取的最大字符数,并指定[和{{1 }}。 ]之后没有尾随的s。格式字符串中的多余空格会导致空格被跳过。

这是您的代码的更正版本。

]