C 我试图理解的字符串指针行为
我编写了一个replacechar函数,它用替换字符替换源字符的实例。函数的工作原理是字符串按预期更改,但当我尝试使用函数的返回值时,puts只输出一个空行 有人能解释一下发生了什么,我需要在replacechar中更改什么来修复吗C 我试图理解的字符串指针行为,c,pointers,C,Pointers,我编写了一个replacechar函数,它用替换字符替换源字符的实例。函数的工作原理是字符串按预期更改,但当我尝试使用函数的返回值时,puts只输出一个空行 有人能解释一下发生了什么,我需要在replacechar中更改什么来修复吗 #include <stdio.h> /* puts */ #include <string.h> /* strcpy */ #include <stdlib.h> /* malloc, free */ char* repla
#include <stdio.h> /* puts */
#include <string.h> /* strcpy */
#include <stdlib.h> /* malloc, free */
char* replacechar(char* s, char ch1, char ch2) {
while (*s) {
if (*s == ch1)
*s = ch2;
*s++;
}
return s;
}
int main()
{
char* s = malloc(8);
strcpy(s, "aarvark");
puts(replacechar(s, 'a', 'z')); /* prints blank line */
puts(s); /* prints zzrvzrk as expected */
free(s);
return 0;
}
一旦
s
指针的值增加到字符串末尾之后,它将返回该指针的值。在replacechar()
中创建一个局部变量,并将其递增,然后返回s
的原始值,这是因为while
在replacechar
中循环直到\0
为止。在函数的末尾,返回指向\0
的指针,而打印\0
是一个空行。您应该这样管理它:
char *replacechar(char *s, char ch1, char ch2) {
char *start = s;
...
return start;
}
这里的问题是变量作用域的问题,因为代码看起来很漂亮 在replacechar中使用不同的本地字符*,如
char* replacechar(char* s, char ch1, char ch2) {
char* tmpstr;
tmpstr=s;
while (*tmpstr) {
if (*tmpstr == ch1)
*tmpstr = ch2;
tmpstr++; /* Note, no "*" here as in your code. */
}
return s; /* s has remained unchanged */
}
#包含/*put*/
#包括/*strcpy*/
#包括/*malloc,免费*/
char*replacechar(char*s,char ch1,char ch2){
char*t=s;
而(*s){
如果(*s==ch1)
*s=ch2;
*s++;
}
返回t;
}
int main()
{
char*s=malloc(8);
strcpy(s,“aarvark”);
放置(replacechar(s,'a','z');/*打印空行*/
放置;/*按预期打印zzrvzrk*/
免费的;
返回0;
}
您真的需要从replacechar返回s吗?当您通过其指针修改字符串时,字符串仍会被修改。为了方便起见-返回结果的成本很低。为了获得令人着迷的完整性(并确保理解)*p++;只需要是p++;谢谢你,佩里,说得好。编辑。
char* replacechar(char* s, char ch1, char ch2) {
char* tmpstr;
tmpstr=s;
while (*tmpstr) {
if (*tmpstr == ch1)
*tmpstr = ch2;
tmpstr++; /* Note, no "*" here as in your code. */
}
return s; /* s has remained unchanged */
}
#include <stdio.h> /* puts */
#include <string.h> /* strcpy */
#include <stdlib.h> /* malloc, free */
char* replacechar(char* s, char ch1, char ch2) {
char* t = s;
while (*s) {
if (*s == ch1)
*s = ch2;
*s++;
}
return t;
}
int main()
{
char* s = malloc(8);
strcpy(s, "aarvark");
puts(replacechar(s, 'a', 'z')); /* prints blank line */
puts(s); /* prints zzrvzrk as expected */
free(s);
return 0;
}