使用C中的指针更改字符串的值

时间:2017-11-23 01:26:47

标签: c string function pointers

我试图通过将字符串的指针传递给函数然后更改函数中该指针的值来更改字符串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";
}

2 个答案:

答案 0 :(得分:0)

在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
}

答案 1 :(得分:0)

数组指示符是不可修改的左值。所以你不能这样改变数组。

在本声明中

char *s = t_string;

创建了一个名为s的新对象,该对象由数组t_string的第一个字符的地址初始化。

在此次电话会议中

editString(s);

创建了分配给函数参数的参数值的副本。

您可以通过以下方式设想函数定义及其调用

editString(s);

//...

void editString(/*char *theString*/){
    char *theString = s; 
    theString = "Good Bye\n";
}

所以即使参数s也没有被函数改变。这首先是由存储在参数theString中的值初始化的局部变量s,然后通过字符串文字"Good Bye\n"的第一个字符的地址重新分配此局部变量。

在函数中没有更改main中定义的数组t_string和指针s

如果要更改数组,则必须单独分配其字符,例如使用标题strcpy中声明的标准字符串函数<string.h>。数组必须有足够的大小来容纳新的字符串文字。

例如

#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 )