[英]Changing the value of a string with a pointer in C
我试图通过将字符串的指针传递给函数,然后在函数中更改该指针的值来更改字符串t_string的值。
我收到的输出是原始字符串“ Hello”。
任何帮助将不胜感激:)谢谢!
#include <stdio.h>
#include "string.h"
void editString(char *theString);
int main() {
char t_string[] = "Hello\n";
char *s = t_string;
editString(s);
printf("The string after: %s", t_string);
return 0;
}
void editString(char *theString){
theString = "Good Bye\n";
}
在C语言中,参数按值传递。 您正在做的是更改局部变量theString
的值以指向字符串文字。 局部变量的变化不会反映在调用函数中。
要更改theString
指向的内容,请使用strcpy
。 这将遵循theString
指向的内容(即main
的数组)。 但是请注意,数组的大小不足以容纳新的字符串,因此,如果这样做,您将在数组的末尾进行写操作并调用未定义的行为。 因此,您需要使数组足够大以容纳任一字符串。
int main() {
char t_string[20] = "Hello\n"; // enlarge array to hold either string
char *s = t_string;
editString(s);
printf("The string after: %s", t_string);
return 0;
}
void editString(char *theString){
strcpy(theString, "Good Bye\n"); // use strcpy
}
数组指示符是不可修改的左值。 因此,您不能以这种方式更改数组。
在此声明中
char *s = t_string;
创建了一个名为s
的新对象,该对象由数组t_string
的第一个字符的地址初始化。
在这次通话中
editString(s);
将创建分配给函数参数的参数值的副本。
您可以通过以下方式想象函数定义及其调用
editString(s);
//...
void editString(/*char *theString*/){
char *theString = s;
theString = "Good Bye\n";
}
因此,即使参数s
也不会被函数更改。 首先是由存储在参数s
的值初始化的局部变量theString
,然后由字符串文字"Good Bye\\n"
的第一个字符的地址重新分配此局部变量。
t_string
未更改数组t_string
或main中定义的指针s
。
如果要更改数组,则必须单独分配其字符,例如,使用在标题<string.h>
声明的标准字符串函数strcpy
。 数组必须具有足够的大小以容纳新的字符串文字。
例如
#include <stdio.h>
#include "string.h"
void editString(char *theString);
int main( void )
{
char t_string[10] = "Hello\n";
char *s = t_string;
editString(s);
printf("The string after: %s", t_string);
return 0;
}
void editString(char *theString){
strcpy( theString, "Good Bye\n" );
}
考虑到根据C标准,没有参数的函数main
应该声明为
int main( void )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.