Удаление похожих букв в слове с помощью указателей - PullRequest
0 голосов
/ 27 мая 2018

Я просто хочу спросить, что не так с моим кодом и почему он говорит об ошибке сегментации (ядро сброшено)?Я пытаюсь просеять все похожие буквы и распечатать только разнородные.Вот мой код (со скелетным кодом от моего профессора) И вот оригинальная инструкция: «удалить все вхождения c в s и вернуть результат.»

#include <stdio.h>

char* clean(char* s,int c);

int main()
{
   clean("banana",'x');
   return 0;
}

char* clean(char* s,int c)
{
   for(int i = 0; i < 6; i++)
   {
     if(s[i] != c)
      {
        printf("c",s);
        s[i]++;
      }
   }
  return s;
}

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Ошибка сегментации

Вы получаете ошибку сегментации, потому что строка «банан» является литералом, что означает, что она доступна только для чтения.

В вашем коде вы пытаетесь сделатьs [i] ++, который увеличивает значение одного из символов .. Что вы не можете сделать, потому что он доступен только для чтения.без него ваш код компилировался и работал нормально.

Решение

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

Следующий код выводит «bnn»:

#include <stdio.h>
#include <string.h> // For strlen
#include <stdlib.h> // For malloc & free

char* clean(char* s, int c);

int main() {
   char* result = clean("banana", 'a');
   printf("%s\n", result);
   free(result); // Everything allocated with malloc must be freed.
   return 0;
}

char* clean(char* s, int c) {
    int length = strlen(s), i = 0, j = 0;
    char* result = malloc(length + 1); // +1 for null terminator.
    memset(result, 0, length + 1);
    for (i; i < length; i++) {
        if (s[i] != c) {
            result[j] = s[i];
            j++;
        }
    }
    return result;
}
0 голосов
/ 27 мая 2018

Потому что в

s[i]++;

s относится к "banana" (строковый литерал), и вы пытаетесь его изменить.Модификация строкового литерала имеет неопределенное поведение, и во многих системах он просто падает, потому что компилятор помещает строковые литералы в постоянную память.

С помощью gcc вы можете использовать -Wwrite-strings для получения предупреждений о подобном коде.

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