Ошибка компиляции в strncpy в моем коде, чтобы найти и напечатать самое длинное слово
Я написал программу, чтобы найти самое длинное слово и напечатать его.
Мой код:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int MaxWord(char text[],char[]);
int main (void){
char text[1000];
char word[1000];
int max;
printf("geben Sie den Text bitte : ");
gets(text);
max=MaxWord(text,word);
printf("ist mit %d Zeichen das laengste wort im Text\n\n\n",max);
return 0;
}
int MaxWord(char text[], char word[])
{
char i;
int ctr=0;
int max=0;
int len;
char begin=0;
len=strlen(text);
for(i=0;i<len+1;i++)
{
if(isalpha(text[i]))
{
if(ctr==0)
{
begin=i;
}
ctr++;
}
else
{
if(ctr>max)
{
max=ctr;
}
ctr=0;
}
}
strncpy(word,begin,max);
printf("%s ",word);
return max;
}
и ошибка:
ошибка № 2140: введите в аргументе 2 ошибку 'strncpy'; ожидаемый "const char * restrict", но найденный "char".
Как я могу это исправить?
2 ответа
Во-первых, вы не должны использовать функцию gets(). Вместо этого используйте scanf. Также см. http://www.cplusplus.com/reference/cstring/strncpy/
Функция strncpy ожидает const char* (так что вы уверены, что функция не изменит исходную строку), и вы передаете ей char. Отсюда и ошибка. Пожалуйста, измените вашу функцию, чтобы передать указатель на символ.
Вам нужно будет перепроверить свою логику и исправить вызов strncpy, передав правильную исходную строку.
Ваша логика в MaxWord
ошибочен: вы всегда пытаетесь скопировать последнее слово с самой длинной длиной. Тип char
не подходит для i
а также begin
так как это смещения в text
потенциально больше, чем 127
,
Более того, strncpy
не делает то, что вы думаете, это делает, это склонная к ошибкам функция, которая не может завершить нулевой буфер назначения. Не используйте эту функцию.
Не использовать gets
либо из-за того, что его нельзя использовать безопасно, неправильный ввод приведет к переполнению буфера.
Вот исправленная версия:
int MaxWord(const char *text, char *word) {
int i, ctr = 0, max = 0, len, begin = 0, best = 0;
len = strlen(text);
for (i = 0; i < len; i++) {
if (isalpha((unsigned char)text[i])) {
if (ctr == 0) {
begin = i;
}
ctr++;
} else {
if (ctr > max) {
best = begin;
max = ctr;
}
ctr = 0;
}
}
memcpy(word, test + best, max);
word[max] = '\0';
printf("%s ", word);
return max;
}
Может показаться удивительным бросить text[i]
как (unsigned char)
, но isalpha()
определяется как принятие int
аргумент со значением unsigned char
или константа EOF
(обычно определяется как -1
). Если ваш компилятор считает char
быть подписанным типом, символы в text
с установленным старшим битом будет считаться отрицательным и будет расширенным знаком при передаче isalpha
потенциально вызывающее неправильное или неопределенное поведение.
Еще одна проблема с вашим кодом - определение границ слов: если вы наберете laengste
правильно как längste
, isalpha()
может неправильно считать символ или символы, кодирующие ä
в качестве разделителя вместо буквы. Добро пожаловать в сложный мир кодировки символов!