Напишите функцию, которая удаляет последний символ из строки в C. Ошибка сегментации (дамп ядра) Ошибка - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь реализовать функцию, как описано в теме, но я получаю ошибку: Segmentation fault (core dumped).В чем моя ошибка?

char* removelast(char* s) {
   char* r = s; 
   while (*s) {
       s++;
   }
   s--;
   *s = '\0';
   return r;
}

1 Ответ

0 голосов
/ 30 сентября 2018

В следующем коде есть несколько проблем:

char* removelast(char* s) {
   char* r = s; 
   while (*s) {
       s++;
   }
   s--;
   *s = '\0';
   return r;
}
  1. Он не проверяет правильность ввода, как s==NULL
  2. Если ввод является пустой строкой (как былоотмечен @Swordfish в комментариях) этот код будет вызывать неопределенное поведение .
  3. Если ввод const char * (например, «Hello World!»), этот код также вызывает undefinedПоведение .

Я бы предложил изменить сигнатуру функции на char *removeLast(const char * s), проверить правильность ввода, выделить новый буфер для строки без последнего символа.Скопируйте необходимые символы из s в новую строку и верните ее указатель.

Что-то в этом роде (надеюсь, это сработало, не проверял)

char *removeLast(const char *s)
{
    char *newStr = NULL;
    size_t sLen; // length of the 's' string

    // check for 's' validity (not NULL and not empty) and successful 'malloc'
    if ( s && (sLen = strlen(s)) && (newStr = malloc(sLen)) )
    {
        int res = strcpy_s(newStr, sLen - 1, s);
        if (!res)
        {
            newStr[sLen - 1] = '\0';
        }
        else // strcpy_s error
        {
            free(newStr);
            newStr = NULL;
        }
    }

    return newStr;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...