[英]String pointer behaviour I am trying to understand
我已经编写了replacechar函数,该函数用替换char替换了源char的实例。 该函数的工作原理是按预期方式更改了字符串,但是当我尝试使用该函数的返回值时,put仅输出一个空行。
有人可以解释一下正在发生的事情以及我需要在replacechar中进行更改以解决的问题。
#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;
}
感谢您的所有回复。
我已更改为此(现在可以正常工作)。
char* replacechar(char* s, char ch1, char ch2) {
char* p = s;
while (*p) {
if (*p == ch1)
*p = ch2;
p++;
}
return s;
}
一旦它的值增加到字符串末尾,它将返回s
指针的值。 在replacechar()
一个局部变量,并将其递增,然后返回s
的原始值。
那是因为replacechar
的while
循环将s
递增至\\0
。 在函数的最后,您将返回指向\\0
的指针,并打印\\0
为空行。 您应该这样管理:
char *replacechar(char *s, char ch1, char ch2) {
char *start = s;
...
return start;
}
您这里的问题,加上其他相当漂亮的代码,是可变范围之一。
在replacechar中使用其他本地char *,例如
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.