2016-12-17 4 views
-2
#include <stdio.h> 
#include <string.h> 
void replace (char a[]){ 
    char *y; 
    *y = 'm'; 
    char *p = a; 
    p = strchr(p, 'g'); 
    while (p){ 
     *p = *y; 
     p++; 
     p = strchr(p, 'g'); 
    } 
} 

int main(){ 
    char x[10]; 
    gets(x); 
    replace(x); 
    puts(x); 
    return 0; 
} 

Что случилось с этой функцией замены? Он не выводит строку, вместо этого указывает на ошибку сегментации.Замена символа в строке

+2

'обугленного * у; '->' символ у =«м '; '..' * p = y; ' – BLUEPIXY

+0

Хорошо работает в онлайн-компиляторе: http://code.geeksforgeeks.org/uuMv89 –

+0

Спасибо, это сработало. –

ответ

0

Вы пытаетесь написать к wild pointer здесь:

char *y; 
*y = 'm'; 

y не указывает где-нибудь, в частности, так что вы получите неопределенное поведение (а ошибки сегментный в вашем конкретном случае).

0

Вы назначаете значение с помощью неинициализированного указателя y. Почему вы используете указатель у в любом случае, вместо

*p = *y; 

вы можете просто сказать

*p = 'm'; 
0

у не выделяется. Это всего лишь указатель, и указатель должен указывать на пробел в памяти. Но вы не выделили места в памяти. Поэтому, когда вы дефференцируете его, он будет переопределять адрес мусора, который имеет неиализованный указатель. Краш ... Так что вместо

char *y; 
*y='p'; 

просто написать:

char y='p'; ///no pointer 

Тогда первая Improvment в функции. Функция слишком специфична, только для персонажа, я бы написал так:

void replace (char a[],char from, char to) 
{ 
    char *p = a; 
    while(*p) 
    { 
     if(*p==from) *p=to; 
      p++; 
    } 
} 
0

Если вы компилируете программу с предупреждениями включены, то вы должны получить предупреждение, как это (с GCC компилятором):

warning: ‘y’ is used uninitialized in this function [-Wuninitialized] 
    *y = 'm'; 
     ^

Перед тем, как вы разыщите указатель y, вам нужно знать, что он указывает на действительный объект, но в вашем случае y не было присвоено значение, чтобы оно могло указывать в любом месте. Также вам не нужен дополнительный указатель; здесь является более кратким (и более общая) версия функции:

static void replace(char old, char new, char s[]) 
{ 
    s = strchr(s, old); 
    while (s != NULL) { 
     *s = new; 
     s = strchr(s, old); 
    } 
} 

Или без использования strchr:

static void replace(char old, char new, char s[]) 
{ 
    int i = 0; 

    while (s[i] != '\0') { 
     if (s[i] == old) { 
      s[i] = new; 
     } 
     i++; 
    } 
} 
Смежные вопросы