如何使用说明符查找字符串中是否存在子字符串?

时间:2019-02-03 18:48:00

标签: c

我有一个带有这种无线电频率的文件

Radio One 104.3
Radio Two 106.3

我必须将收音机的名称或频率传递给程序。如果我通过无线电的名称或浮点数,则会出现分段错误。我必须使用说明符%[^set]在要在终端中通过频率的Cass中找到无线电的名称。我该怎么办?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main(int argc, char *argv[]){
    FILE *in;
    in = fopen("frequenze.txt", "r");
    char radio[100];
    float frequenza;

    if(isalpha(argv[1]) != 0){
        while(fgets(radio, 100, in) == radio){
            if(strncmp(argv[1], radio, strlen(argv[1])) == 0){
                printf("%s\n", radio);
            }
        }
    }
    if(isdigit(argv[1]) != 0){
        while(fscanf(in, "%[^%f]", &frequenza) == 1){
            if(frequenza == atof(argv[1])){
                fgets(radio, 100, in);
                printf("%s\n", radio);
            }
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

尽管很小,但该程序仍然为或多或少的细微错误提供了很多机会。

  • 应该检查是否给出了程序自变量。
  • 使用isalpha()isdigit(),只能测试一个字符,不能测试整个字符串。也许您是说isalpha(*argv[1])isdigit(*argv[1])
  • 在字符类中使用转换说明(如[^%f])是有想象力的,但没有用。同样,如果没有 fseek 操作,也无法从头开始重读in中的一行。从一开始就更好地读取名称和频率。
  • 由于操作数的精度不同(frequenza == atof(argv[1])float frequenza),比较double atof()失败。

    if (argc < 2) return 1;
    if (isalpha(*argv[1]))
        while (fgets(radio, 100, in) == radio)
            if (strncmp(argv[1], radio, strlen(argv[1])) == 0)
                printf("%s", radio);
    if (isdigit(*argv[1]))
        while (fscanf(in, "%[^0-9]%f ", radio, &frequenza) == 2)
            if (frequenza == (float)atof(argv[1]))
                printf("%s%g\n", radio, frequenza);