2015-10-07 1 views
0

Я пытаюсь удалить все повторяющиеся символы из заданной строки. Например, "asdasd" = "asd" или "abbgga" = "abg".Удалить все дублированные символы из строк - c

Когда я компилирую и когда cmd начинает запускать его, я получаю сообщение «перестало работать».

Это мой код:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void delMul(char str[]){ 
    int i,j=0; 
    int s[26]; 
    char k ; 
    for (i = 0; i < 26; i++) 
    { 
     s[i] = 0; 
    } 
    for (i = 0; i < strlen(str); i++) 
    { 
     k = str[i] - 'a'; 
     if(s[k] == 0) { 
      s[k]++ ; 
      str[j++] = str[i]; 
     } 
    } 
    str[j] = '\0'; 
} 

int main(){ 
    char *str = "asdasd"; 
    delMul(str); 
    puts(str); 
} 
+0

Вы пытались отладить это? – Bathsheba

+2

Измените 'char * str =" asdasd ";' на 'char str [] =" asdasd ";' как в первом случае 'str' - строковый литерал, хранящийся в памяти только для чтения. –

+2

первая проблема: есть 256 символов не только 26 и их нужно разрешить для всех этих символов. Вторая проблема: массив «asdasd» является строковым литералом, а строковые литералы находятся в памяти readonly, поэтому этот оператор: 'str [j ++] = str [i];' приведет к событию сбоя seg. – user3629249

ответ

2

В коде str указывает на строка буквального, которые не могут быть изменены. Попробуйте использовать массив для того же самого инициализированного строкой.

1

В основной вы объявили ул, как указатель на строку

Таким образом, хранение выделяется в виде фиксированной строки в программе, а не в качестве данных

Так что, когда вы пытаетесь написать к нему в строке 18 str[j++]=str[i] есть SEGV, поскольку это не допускается

Чтобы исправить это объявить строку как массив полукокса, который инициализируется вместо

int main(){ 
    char str[] = "asdasd"; 
    delMul(str); 
    puts(str); 
}