2015-04-19 2 views
0

По какой-то причине при создании моей программы, он говорит, что у меня есть эта ошибка:Неизвестная ошибка при конверсии [C]

error: invalid conversion from 'char' to 'const char*' [-fpermissive] 
     strcpy(phrase[counter].word, ch); 

Я не совсем уверен, что означает, что компилятор, я попытался изменить char ch до const char ch, но это не похоже на проблему. Если бы кто-нибудь мог пролить свет на этот вопрос, это было бы здорово.

Вот код, который вы можете найти на сайте:

const char* clean_word(void); 

void create_word(struct Word_setup phrase[], FILE *fp) 
{ 
    char ch; 

    fscanf(fp, "%s", &ch); 
    strcpy(phrase[counter].word, ch); 
    strcpy(phrase[counter].word, clean_word()); 
} 

const char* clean_word() 
{ 
    int i; 
    const char *ch = phrase[counter].word; 

    ch = phrase[counter].word; 

    for (i = 0; i < M; i++) 
    { 
     if (phrase[counter].word[i] == 39 || isalpha(phrase[counter].word[i])) //39 is the ASCII value for: ' 
      i = i; //Just to be there, no reason to it. I just want the program to do nothing if its a letter or ' 
     else 
      phrase[counter].word[i] = '\0'; 
    } 
    return ch; 
} 

Кроме того, в случае, если вам интересно, что это за, я создаю программу, которая будет сканировать *.txt файл, а затем распечатать слова с наибольшим количеством выступлений, а также количеством выступлений.

Если вы уже прочитали мое старое сообщение, я решил попробовать его без повторного выделения пространства каждый раз, когда массив заполняется, и я просто установил его на 200 максимальных типов слов. Я поменяю программу, когда закончу, чтобы он перераспределял пространство каждый раз, когда массив заполняется.

+0

у вас отсутствует указатель на char ch. – macmania314

+0

Повторяя себя: 'const char * ch = phrase [counter] .word; ch = фраза [counter] .word; 'действительно не помогает, хотя в этом контексте он не наносит огромного ущерба (в других случаях, например, при распределении памяти, это может быть вредно). –

+0

относительно этой строки: 'for (i = 0; i user3629249

ответ

2

может быть ...

void create_word(struct Word_setup phrase[], FILE *fp) 
{ 
    fscanf(fp, "%s", phrase[counter].word); 
    clean_word(); 
} 
+0

ничего себе, это гораздо умнее ...Я должен был подумать о том, что haha ​​ – Nicolas

+1

@Nicolas Не только умнее, ваш код испытывает переполнение буфера в 'scanf' - он считывает строку в односимвольное местоположение в стеке. – user3125367

3

Проблема здесь:

char ch; 

    fscanf(fp, "%s", &ch); 
    strcpy(phrase[counter].word, ch); 

strcpy() функция ожидает, что ее второй аргумент, чтобы быть указатель к главе исходной строки, но ch является char, а не char * или const char *. Как объяснил Кейт Томпсон, это ошибка, потому что целые числа неявно конвертируются в указатели в C (кроме постоянного выражения со значением 0). Даже если компилятор выполнил неявное преобразование в любом случае, поведение, безусловно, не будет тем, что вы хотите.

Кроме того, fscanf() не собирается делать то, что вы хотите, либо, потому что даже если аргумент &ch является правильным типа для строки формата она сопровождает, это указатель только один символ памяти, и fscanf будет всегда писать за пределами своих границ, если он успешно сканирует строку (потому что он должен написать ограничитель строки даже для односимвольной строки).

@ Подход BLUEPIXY намного лучше, если предположить, что phrase[counter].word - массив char, но даже там вы рискуете преодолеть его границы. Чтобы защитить себя от этого, укажите ширину поля. Например, если phrase[counter].word представляет собой массив из 20 char с, а затем использовать это ...

fscanf(fp, "%19s", phrase[counter].word); 

... для того, чтобы scanf() не написать более 20 символов (в том числе струнный терминатора) в массив.

+1

и 'strcpy (фраза [counter] .word, clean_word());' UB. – BLUEPIXY

+1

"* Я не уверен, почему это ошибка, так как все целые значения конвертируются в указатели в C *" - Целочисленные значения (кроме специального случая '0', который является константой нулевого указателя) не * неявно * конвертируется в указатели. –

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