Как мне найти подстроку в строке, используя спецификатор? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть файл с радиочастотами этого типа

Radio One 104.3
Radio Two 106.3

И я должен передать программе название радио или частоты.Если я передаю название радиоприемника или число с плавающей точкой, оно идет по ошибке сегментации.Я должен использовать спецификатор %[^set], чтобы найти название радио в кассете, которую я передаю в терминале частоту.Как я могу это сделать?

#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 голосов
/ 04 февраля 2019

Несмотря на небольшой размер, эта программа все еще предлагает довольно много возможностей для более или менее скрытых ошибок.

  • Следует проверить, задан ли программный аргумент вообще.
  • С isalpha() и isdigit() может быть проверен только символ, а не целая строка.Возможно, вы имели в виду isalpha(*argv[1]) и isdigit(*argv[1]).
  • Использование спецификации преобразования в классе символов (например, [^%f]) - это образно, но не работает.Также вы не можете перечитать строку с in с начала без операции fseek .Лучше сразу прочитать имя и частоту сразу.
  • Сравнение 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...