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

C 如何使用说明符查找字符串中是否存在子字符串?,c,C,我有一个关于这种无线电频率的文件 Radio One 104.3 Radio Two 106.3 我必须把收音机的名字或频率传给节目。如果我传递收音机的名称或浮点数,它就会出现分段错误。我必须使用说明符%[^set]在cass中查找我在终端中传递频率的收音机的名称。我该怎么办 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int mai

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

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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
文件*in;
in=fopen(“frequenze.txt”,“r”);
字符无线电[100];
浮动频率;
if(isalpha(argv[1])!=0){
while(fgets(收音机,100英寸)=收音机){
if(strncmp(argv[1],radio,strlen(argv[1]))==0){
printf(“%s\n”,收音机);
}
}
}
如果(isdigit(argv[1])!=0){
while(fscanf(in,“%[^%f]”,&frequenza)==1){
if(frequenza==atof(argv[1])){
fgets(无线电,100英寸);
printf(“%s\n”,收音机);
}
}
}
返回0;
}

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

  • 应该检查是否给出了程序参数
  • 使用
    isalpha()
    isdigit()
    ,只能测试一个字符,不能测试整个字符串。也许你的意思是
    isalpha(*argv[1])
    isdigit(*argv[1])
  • 在字符类中使用转换规范(如
    [^%f]
    )很有想象力,但不起作用。此外,如果没有fseek操作,则无法从头开始重新读取中的
    中的行。最好从一开始就把名字和频率一起读
  • 由于操作数的精度不同(
    float frequenza
    vs.
    double atof()
    ),比较
    frequenza==atof(argv[1])
    失败

if(argc<2)返回1;
if(isalpha(*argv[1]))
while(fgets(收音机,100英寸)=收音机)
if(strncmp(argv[1],radio,strlen(argv[1]))==0)
printf(“%s”,收音机);
if(isdigit(*argv[1]))
而(fscanf(在“%[^0-9]%f”中),无线电和频率=2)
if(frequenza==(float)atof(argv[1]))
printf(“%s%g\n”,无线电,频率);

评论不用于扩展讨论;此对话已结束。如果使用*argv[1],您是指第一个字符还是指整个字符串?*argv[1]是否与argv[1][0]相同?使用%[^0-9]表示您正在存储字符串,但一旦发现包含在0和9之间的数字,它就会停止扫描?我不明白为什么它不打印无线电字符串,而是打印频率。我和你做的一模一样。第一个if有效,但第二个不行。@user11006304-
*argv[1]
是字符串
argv[1]
的第一个
char
,是的,与
argv[1][0]
@user11006304-是的,
%[^0-9]
存储字符串(包括空格),直到找到一个数字。请注意,这意味着无线电台名称不能包含数字。
    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);