2016-12-17 186 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

'炭* Y;' - >'炭Y =「米';''* 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

y不分配。它只是一個指針,指針必須指向內存中的空間。但是你沒有在內存中分配任何空間。所以當你對它進行細分時,它會去掉一個非itialized指針所具有的垃圾地址。崩潰...... 因此,而不是

char *y; 
*y='p'; 

只是寫:

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

然後,在功能的第一改良效果。函數過於特殊,只是一個字,我會寫這樣的:

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'; 
     ^

在您取消引用指針之前,您需要知道它指向的是有效對象,但在您的情況下,尚未分配值,因此它可以指向任何位置。你也不需要任何額外的指針;這裏是該功能的更簡潔(和更普遍的)版本:

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++; 
    } 
}