C函数使用指针更改字符串

时间:2014-09-04 14:59:46

标签: c string function

我正在尝试创建一个从main函数更改char数组的函数,这就是我正在尝试做的事情:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

void change(char *a);

int main()
{
    char a[] = "hello";
    printf("\na = %s", a);
    change(a);
    printf("%\na = %s", a);
    getch();
}

void change(char *a)
{
    a = "goodbye";
}

3 个答案:

答案 0 :(得分:9)

此代码存在一些问题,但首先我们需要退一步讨论如何在C中处理数组。

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,表达式为&#34; N元素数组T&#34;将被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向T&#34;的指针,并且表达式的值将是第一个元素的地址。阵列。

在声明中

char a[] = "hello";

"hello"是一个字符串文字,其类型为&#34; 6个元素的数组char&#34; (5个字符加0终结符)。由于它用于在声明中初始化数组a,因此上述规则不适用;相反,a的大小设置为与文字(6)的大小相同,并且字符串文字的内容被复制到数组。

当您从change致电main

change(a);

表达式 a具有char&#34;的类型&#34; 6元素数组。由于它既不是字符串文字也不是sizeof或一元&运算符的操作数,因此该表达式将转换为&#34;指向char&#34;的指针,并且表达式的值将是aray的第一个元素的地址。因此,change函数被声明为

的原因
void change(char *a);

在这种情况下,a只是一个指针。当你写

a = "goodbye";

字符串文字"goodbye"未在初始化程序中使用,并且它不是sizeof或一元&运算符的操作数,因此表达式转换为type&#34;指向char&#34;的指针,表达式的值是第一个字符的地址。那么这里发生的是您将字符串文字"goodbye"地址复制到a。这会覆盖a中的值,但此aa中的数组 main不是内存中的对象,因此任何更改它没有反映在main中。

如果要更新数组的内容,则需要使用库函数strcpy/strncpy(对于以0结尾的字符串)或memcpy(对于所有内容) else),或明确更新每个元素(a[0]='g'; a[1]='o'; a[2]='o';等)。

要更新a的内容,请使用

strcpy( a, "goodbye" );

<强>除 ...

a只能容纳5个字符和0个终结符; "goodbye"是7个字符加0终结符;它的两个字符大于a能够存储的字符。 C将很乐意让您执行操作并在a之后立即删除字节,这可能会导致任何数量的问题(缓冲区溢出,例如这是一种典型的恶意软件攻击)。在这个时刻,你有几个选择:

首先,您可以声明a足够大以处理任一字符串:

#define MAX_LEN 10
...
char a[MAX_LEN] = "hello";

其次,您可以限制复制到a的字符串的大小:

void change( char *a, size_t size )
{
  strncpy( a, "goodbye", size - 1 );
  a[size - 1] = 0;
}

请注意,当您致电a时,您需要传递change可以存储的元素数量作为单独的参数;没有办法从指针告诉它指向的数据有多大:

change( a, sizeof a / sizeof *a ); // although in this case, sizeof a would be
                                   // sufficient.

答案 1 :(得分:-2)

主要问题是你通过这样做发送了一个char charinteur a的副本:

void change(char *a)
{
    a = "goodbye";
}

如果你想改变其他功能中的值,你应该这样做:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

void change(char **a);

int main()
{
    char *a = "hello";
    printf("\na = %s", a);
    change(&a);
    printf("%\na = %s", a);
    getch();
}

void change(char **a)
{
    *a = "goodbye";
}

答案 2 :(得分:-2)

我改变了功能,现在它可以这样工作:

void change(char *a)
{
    strcpy(a, "goodbye");
}