2016-12-17 189 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++; 
    } 
}