繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM