我有一个带有这种无线电频率的文件
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;
}
答案 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);