Member 14838257 Ответов: 2

Справка по строкам с использованием динамического выделения


Привет всем! Мне нужна ваша помощь, если вы можете.Я должен запустить программу, которая удаляет определенный символ из данной строки.У меня есть функция, которая имеет строку и символ.Например слово hello это строка а символ это l.My новая строка я хочу быть Хио.Я написал свой код, но мой вывод равен нулю.Можете ли вы помочь мне найти мою ошибку??
Вот мой код:
char* Delete(char *s1,char c)
{
    char *s2; //the new string
    int n1,n2=0,n3;
    n1=strlen(s1); //find the length of my string
    while(*s1!='\0') //in this loop i find how many characters is similar to c 
    {
        if(*s1==c)
            n2++;
        s1++;
    }
    n3=n1-n2; //find the length of new string s2
    s2=(char *)malloc((n3+1)*sizeof(char));
   while(*s1)
   {
       if(*s1!=c)
       {
           *s2++=*s1;
       }
       s1++;
   }
   *s2='\0';
   return s2;
}


int main()
{
   char s1[20],c;
   scanf("%c\n",&c);
   gets(s1);
   printf("The new string is: %s",Delete(s1,c));

    return 0;
}


Что я уже пробовал:

Помогите мне, пожалуйста, я новичок, поэтому мне нужен ваш совет!

2 Ответов

Рейтинг:
2

Richard MacCutchan

Ваш первый цикл в функции Delete повторяет s1, пока не найдет нулевой Терминатор. Итак, s1 теперь указывает на конец строки. Поэтому, когда вы запускаете второй цикл s1, кажется, что он ничего не содержит. Гораздо более простой метод состоит в том, чтобы выделить буфер той же длины, что и s1, и просто выполнить второй цикл, в котором вы пропускаете соответствующие буквы. Однако это все равно приводит к нулю, так как s2 будет указывать на нулевой Терминатор в конце цикла. Поэтому вам нужен еще один указатель, который является копией s2. В конце цикла верните этот указатель, который все равно будет указывать на начало новой строки.


Рейтинг:
0

OriginalGriff

Первое, что нужно сделать, когда ваш код не работает, - это отладчик: он бы показал вам проблему за считанные секунды!

Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Подсказка: где находится s1 указывая после того, как первая петля закончена?