#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;
}
这个替换功能出了什么问题? 它不输出字符串而是表示分段错误。
答案 0 :(得分:1)
答案 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++;
}
}