C语言中的指针和字符串
我正在尝试编写一个函数来修改C中的字符串。 如果我有一个函数C语言中的指针和字符串,c,string,pointers,C,String,Pointers,我正在尝试编写一个函数来修改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';然后返回s,它将返回s的第一个位置的地址,但带有修改
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';然后返回s,它将返回s的第一个位置的地址,但带有修改的内容,还是返回带有原始内容的地址
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
}
在这段代码中,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
}
在守则中:
char *func(char *s)
{
char *t=s;
}
您缺少return语句,因此将返回垃圾
变量s是传递给函数的任何内容的本地副本。如果在函数内部编写s++,则会更改本地指针指向的对象,但不会更改参数
当您不使用t++;和*t='a';,将t指向作为s传递的字符串的第二个字符,然后将字符“a”指定给该字符串
因此,如果您有:
char *func(char *s)
{
char *t = s;
s++;
t++;
*t = 'a';
return s;
}
然后,返回值将是指向原始字符串的第二个字符的指针,该字符串已被修改为包含“a”。在代码中:
char *func(char *s)
{
char *t=s;
}
您缺少return语句,因此将返回垃圾
变量s是传递给函数的任何内容的本地副本。如果在函数内部编写s++,则会更改本地指针指向的对象,但不会更改参数
当您不使用t++;和*t='a';,将t指向作为s传递的字符串的第二个字符,然后将字符“a”指定给该字符串
因此,如果您有:
char *func(char *s)
{
char *t = s;
s++;
t++;
*t = 'a';
return s;
}
然后,返回值将是指向原始字符串的第二个字符的指针,该字符串已修改为包含“a”
如果我不使用t++;和*t='a';然后返回s,它会返回
第一个点的s,但与修改的内容或它将返回
地址是否与原始内容一致
char *func(char *s)
我相信你的问题是这样假设的:
char s[] = "abcde";
char *t = s;
t++;
*t = 'a';
这里有一个字符串和两个指针,它们最初都指向字符串的开头。在第三行,修改其中一个指针以指向下一个字符。在第四行,修改该位置的数据。由于s指向相同的数据,并且数据已被修改,因此s指向的字符串将发生更改
printf("s is: %s\n", s"); // s is: aacde
printf("t is: %s\n", t"); // t is: acde
顺便说一句,没有比编写小测试程序并使用它们更好的方法来真正学习这些东西了。一本好书会解释事情应该如何运作,但玩代码是你真正理解代码并相信书中所说的话的方式
如果我不使用t++;和*t='a';然后返回s,它会返回
第一个点的s,但与修改的内容或它将返回
地址是否与原始内容一致
char *func(char *s)
我相信你的问题是这样假设的:
char s[] = "abcde";
char *t = s;
t++;
*t = 'a';
这里有一个字符串和两个指针,它们最初都指向字符串的开头。在第三行,修改其中一个指针以指向下一个字符。在第四行,修改该位置的数据。由于s指向相同的数据,并且数据已被修改,因此s指向的字符串将发生更改
printf("s is: %s\n", s"); // s is: aacde
printf("t is: %s\n", t"); // t is: acde
顺便说一句,没有比编写小测试程序并使用它们更好的方法来真正学习这些东西了。一本好书会解释事情应该如何运作,但玩代码是你真正理解代码并相信书中所说的话的方式。你需要什么行为 返回s的初始值和s的最终值都是有意义的 您没有的一个选项是执行*t='a',但在原始内存不变的情况下返回。内存已更改 返回原始的s非常常见,例如strcpy 返回指向“我刚刚修改的字符之后的下一个字符”的指针也是很常见的,这是您没有提供的选项 你需要仔细考虑
h、 然后决定函数要做的有帮助的事情是什么 你需要什么样的行为 返回s的初始值和s的最终值都是有意义的 您没有的一个选项是执行*t='a',但在原始内存不变的情况下返回。内存已更改 返回原始的s非常常见,例如strcpy 返回指向“我刚刚修改的字符之后的下一个字符”的指针也是很常见的,这是您没有提供的选项
您需要仔细考虑,并决定函数要做的有帮助的事情是什么 读一本书。有很多关于C如何工作的书。你的函数目前没有返回任何东西,所以你的问题不清楚。书。原始互联网。其中一个选项不可能看到答案。其他的,还有更多的是可能的。我们没有足够的信息给你提供好的建议。我们需要你提供更多关于你打算做什么的信息。读一本书。有很多关于C如何工作的书。你的函数目前没有返回任何东西,所以你的问题不清楚。书。原始互联网。其中一个选项不可能看到答案。其他的,还有更多的是可能的。我们没有足够的信息给你提供好的建议。我们需要你提供更多关于你要做什么的信息。我认为你需要一个双指针来指向一个指针。这难道不等于说int a=b,如果我改变a,b就会改变吗?@千叶:我不完全确定你在问什么。是的,您需要一个双指针来指向指针。但参数列表中的s只是指针的副本,而不是指向指针的指针。类似地,t是一个简单的指针。但是*t赋值给s指向的字符串的一部分。写入*t='a';修改字符串,但不修改指向该字符串的指针。特别是,如果调用是func&array[4],那么*t赋值会修改调用函数中的数组[5],而不会更改&array[4],因为它是不可修改的。我想您需要一个双指针来指向指针。这难道不等于说int a=b,如果我改变a,b就会改变吗?@千叶:我不完全确定你在问什么。是的,您需要一个双指针来指向指针。但参数列表中的s只是指针的副本,而不是指向指针的指针。类似地,t是一个简单的指针。但是*t赋值给s指向的字符串的一部分。写入*t='a';修改字符串,但不修改指向该字符串的指针。特别是,如果调用是func&array[4],那么*t赋值会修改调用函数中的数组[5],而不会更改&array[4],因为它是不可修改的。您不需要char s[]=abcde来修改它吗?@steabert是的,您当然需要。谢谢你的关注。你不需要char s[]=abcde来修改它吗?@steabert是的,你当然需要。谢谢你抓住它。Aa你增加了指针t,空闲位未定义。Aa你增加了指针t,空闲位未定义。