2015-05-10 4 views
0

Я хочу написать программу, которая удаляет гласные в строке. Это мой код:Как удалить гласные в строке

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

void f (char s[100]) 
{ 
    int ok=0; 
    for (int i=0; i<strlen(s); i++) 
    { 
     if ((s[i]=='a')||(s[i]=='e')||(s[i]=='i')||(s[i]=='o')||(s[i]=='u')) 
     { 
      ok++; 
      strcpy (s+i,s+i+1); 
     } 
    } 
    printf ("%s",s); 
} 

int main() 
{ 
    f("alina"); 
    return 0; 
} 

Когда я его скомпилирую, моя программа перестает работать. То же самое происходит, когда я его отлаживаю: когда я добираюсь до строки strcpy (s+i,s+i+1);, появляется сообщение об ошибке: «программа перестала работать». Я делаю что-то неправильно? Я что-то пропустил?

ответ

3

Проблема здесь в том, что вы звоните

f("alina"); 

с строкового литерала ("alina"), который обычно присутствует в только для чтения памяти и не изменяемый. Любая попытка изменить строковый литерал приведет к неопределенному поведению.

Вместо этого, вы можете сделать что-то вроде

int main (void) 
{ 
    char arr[] = "alina"; 

    f(arr); 
    return 0; 
} 

которого

  • определяет массив [изменяемый] под названием arr
  • инициализировать массив со значением "alina"
  • пройти массив функция f().

Также сделайте отметку о правильной подписке main().

+0

Если бы вы сказали «строка» вместо «строка», это было бы правильно ... как исходный код и ваш передают «строку». – Dmitri

+0

Спасибо, г-н@Dmitri, ты очень прав. :-) –

1

В вашей программе есть две основные проблемы.

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

И, во-вторых, вы не можете использовать strcpy, когда диапазоны перекрывают друг друга. Вместо strcpy вы должны использовать memmove

От C Стандартный

Если копирование происходит между объектами, которые перекрывают друг друга, поведение неопределенными.

И копировать всегда целую часть строки для удаления только одного символа неэффективно.

Также заявление

printf ("%s",s); 

должны быть перемещены из функции в основной.

1

Для решения этой проблемы можно использовать Twix трюк, известный как метод два пальца:

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

char *strip_vowels(char *s) { 
    for (char *p1 = s, *p2 = s; (*p1 = *p2) != '\0'; p2++) 
     p1 += !strchr("aeiou", *p1); 
    return s; 
} 

int main(void) { 
    char msg[] = "Hello world\n"; 
    fputs(strip_vowels(msg), stdout); 
    return 0; 
} 
Смежные вопросы