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

问题描述 投票:1回答:2

我想从文件中读取信息,并将文件中的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
c scanf
2个回答
2
投票
  • 格式说明符"%^"没有意义,实际上不会做任何事情 - 所以你永远不会在你的zimu数组中得到任何东西。
  • s之后的格式说明符中的%[1-9]意味着“匹配文字的'字符”,所以永远不会匹配。你可能只是想删除它。
  • 由于输入行以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%[说明符读取固定数组的边界,以确保它们不会溢出。

0
投票

关于%[abc]格式字符串中的scanf扫描集存在一些混淆:您应该指定要读取的最大字符数,并给出[]之间的字符范围。在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] = '\0';
    while (fgets(buffer, 1024, fp) != NULL) {
        if (sscanf(buffer, " %127[a-z]", zimu) != 1)
            continue;
        printf("zimu is: %s\n", 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=%s\n", zahla, zahlb);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.