我正在尝试编写一个函数来修改C中的字符串。 如果我有像
这样的功能char *func(char *s){
char *t=s;
s++; //option 1
t++; //option 2
*t='a'; //option 2
return s;
}
如果我执行类似[option 1]的操作:s++;
我相信它会将指针返回到s指向的位置。如果我执行[选项2]:t++;
和*t='a';
然后return s
,它是否会返回s
的第一个地址,但修改了内容,或者是否会返回地址与原始内容?
答案 0 :(得分:4)
char *func(char *s)
在此代码中,s
是指向内存区域的指针,(我假设)表示字符串。
s++;
现在s
指向同一内存区域中的下一个字符,(我假设)代表一个字符串。
char *t=s;
现在你有两个指向该内存区域的指针。
t++;
*t='a';
现在您已更改了该内存区域,将第二个字符替换为'a'
。
因此:如果然后返回s
,您将返回指向同一内存区域的指针,该区域已被更改。如果要返回字符串的更改副本,则必须先复制内存。
char *func(char *s){
char *t=strdup(s); //duplicates a string
s++;
*t='a';
free(t); //you have to free the memory from strdup at some point
return s; //returns pointer to second character of unchanged string
}
答案 1 :(得分:2)
如果我做t ++;和* t ='a';然后返回s,它会返回地址吗? s的第一个地方,但内容已经修改或将返回 地址与原始内容?
我相信你的问题假设是这样的:
char s[] = "abcde";
char *t = s;
t++;
*t = 'a';
这里你有一个字符串和两个指针,最初都指向字符串的开头。在第三行,您修改其中一个指针以指向下一个字符。在第四行,您修改该位置的数据。由于s
指向相同的数据,并且数据被修改,因此指向的字符串将发生变化。
printf("s is: %s\n", s"); // s is: aacde
printf("t is: %s\n", t"); // t is: acde
顺便说一下,真正学习这些东西没有比写小测试程序和玩它们更好的方法了。一本好书将解释事情应该如何运作,但是使用代码是你成长为真正理解代码并相信书籍告诉你的方式。
答案 2 :(得分:0)
在代码中:
char *func(char *s)
{
char *t=s;
}
你缺少一个return语句,所以返回垃圾。
变量s
是传递给函数的任何内容的本地副本。如果在函数内部写s++
,则更改本地指针指向的内容,但不要更改参数。
当您执行t++;
和*t = 'a';
时,您将t
指向作为s
传递的字符串的第二个字符,然后指定字符{{1那个。
所以,如果你有:
'a'
然后返回值将是指向原始字符串的第二个字符的指针,该字符串已被修改为包含char *func(char *s)
{
char *t = s;
s++;
t++;
*t = 'a';
return s;
}
。
答案 3 :(得分:0)
您需要什么行为?
返回s的初始值,并返回s的最终值是有意义的。
您没有的一个选项是*t='a'
,但返回原始内存不变。内存已更改
返回原始s很常见,例如strcpy。
在我刚刚修改过的字符之后返回指向下一个字符的指针也很常见。 (这是你没有提供的选项)。
您需要仔细思考,并确定该功能有用的功能是什么?