替换字符串中的字符

时间:2016-12-17 08:47:14

标签: c

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

这个替换功能出了什么问题? 它不输出字符串而是表示分段错误。

4 个答案:

答案 0 :(得分:1)

您正在尝试写一个wild pointer

char *y;
*y = 'm';

y没有特别指向任何地方,因此您会得到未定义的行为(在您的特定情况下出现seg错误)。

答案 1 :(得分:1)

您使用未初始化的指针y来分配值。 为什么要使用指针y而不是

*p = *y;
你可以说

*p = 'm';

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果您在启用警告的情况下编译程序,您应该收到类似的警告(使用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++;
    }
}