Ошибка компиляции в 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() может неправильно считать символ или символы, кодирующие ä в качестве разделителя вместо буквы. Добро пожаловать в сложный мир кодировки символов!

Другие вопросы по тегам