2016-01-03 3 views
-1

Я пытаюсь прочитать символы из файла (сделано) и подсчитать количество раз, когда отображается аргумент из командной строки. Когда я запускаю код снизу, я получаю следующую ошибку в моем терминале: «В файле, включенном в Fisier.c: 3: 0: /usr/include/string.h:144:12: note: expected 'const символ *», но аргумент типа 'полукокс' экстерна Int STRCMP (Const символ * __ s1, сопзИте полукокс * __ s2)"Сравните текст файла с argvc

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

int main(int argc, char *argv[]) { 
    int c, nr = 0; 
    char filename[30]; 
    char ch; 
    char *ch2; 
    strcpy(ch2, argv[2]); 

    strcpy(filename, argv[1]); 
    FILE *file; 
    file = fopen(filename, "r"); 

    if (file) { 
     do { 
      ch = fgetc(file); 
      if (feof(file)) 
       break; 
      char *pChar = malloc(sizeof(ch)); 
      strcpy(pChar[0], ch); 
      if (strcmp(ch2, pChar[0])) 
       nr++; 
     } while(1); 

     fclose(file); 
    } 
    printf("%d", nr); 
    return 0; 
} 
+0

'Pchar [0]' имеет тип полукокса, но 'strcmp' ожидает типа константный символ *. возможно, вы хотели передать 'pChar' вместо этого? – UnholySheep

+0

Я пробовал это раньше, это результат: "/usr/include/string.h:129:14: note: expected 'const char * __restrict__', но аргумент имеет тип 'char' extern char * strcpy (char * __ ограничивать __dest, const char * __ ограничивать __src) « –

+0

a) всегда проверять' argc' и b) у вас есть утечка памяти из 'malloc', поскольку вы постоянно переписываете указатель, c) вы выделили только 1 байт памяти для копирования строки (предполагаемого намерения) в. –

ответ

1

программы вы есть несколько проблем:

  • вы используете строковые функции где вы должны просто использовать символы напрямую.
  • вы используете feof() для проверки конца файла, лучше прочитать байты файлов в int и сравнить с EOF.
  • вы копируете argv[1] в буфер с 30 байтами, аргументы командной строки могут быть длиннее 29 байтов. Просто используйте его напрямую.

Вот исправленный вариант:

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

int main(int argc, char *argv[]) { 
    int c, search, nr = 0; 
    FILE *file; 

    if (argc < 3) { 
     printf("usage: %s file character\n", argv[0]); 
     exit(1); 
    } 

    // set search as the character to count. 
    // it must be cast as unsigned char because getc(file) returns 
    // unsigned char values which may be different from char values 
    // if char is signed and the file contains non ASCII contents. 
    search = (unsigned char)(*argv[2]); 

    file = fopen(argv[1], "r"); 
    if (file) { 
     while ((c = getc(file)) != EOF) { 
      if (c == search) 
       nr++; 
     } 
     fclose(file); 
    } 
    printf("%d\n", nr); 
    return 0; 
} 
+0

Это сработало, я пробовал что-то подобное, но моя переменная «search» не была типа int. Спасибо за вашу помощь! –

Смежные вопросы