为什么字符串修改没有按预期进行?

时间:2015-07-20 13:34:31

标签: c string pointers

我试图实现以下代码。

/favicon.ico

我相信我正在修改引用,我期待输出

  

"你好ABC"

但输出是

  

" Hello XYZ"。

任何人都可以解释错误吗?

5 个答案:

答案 0 :(得分:3)

  1. C使用pass-by-value进行函数参数传递。因此,您实际上无法从p更改qabc()。要实际更改pq本身,您需要将指针传递给每个人。
  2. 无论如何,
  3. p=q;不是复制字符串的方法。您需要使用strcpy()复制字符串。
  4. 您正在使用参数来调用abc(),这些参数是字符串文字的指针。如果您尝试修改这些输入参数所指向的,那么您将面对undefined behaviour

答案 1 :(得分:1)

首先,你有一个多余的**尾随。

其次,函数abc修改按值传递给它的指针p,然后抛弃结果。为什么你会期待任何不同的行为?

答案 2 :(得分:1)

pq指向只读字符串文字。

尝试更改他们指向的数据是未定义的行为。您可以更改pq指向的内容(即重新分配指针很好)。

幸运的是,您没有在函数abc中更改它们,因为您按值传递指针

如果你想修改字符串,那么你需要使用char p[] ="Hello XYZ";等。这会创建一个固定长度的读写空终止字符串。

答案 3 :(得分:0)

C中有两种处理字符串的样式:数组样式和指针样式。你正在尝试做的事情更适合阵列风格。

在数组样式中,您始终使用strcpy复制字符串或字符串片段。您还必须始终确保阵列足够大。

在数组样式中,您的代码如下所示:

#include <stdio.h>
#include <string.h>
void abc(char [], char []);
int main(int argc, char *argv[])
{
    char a[]="Hello XYZ";
    char b[]="ABC";
    abc(q, b);
    printf("%s", a);
}

void abc(char a[], char b[])
{
    strcpy(a+6, b);
}

虽然它依赖于事实(即&#34;盲目地假设&#34;),但传递给函数a的字符串abc至少比{{长6个字符。 1}}。

另外,我必须警告你,事实证明你的函数b和我的函数签名 - 即参数列表 - 实际上没有区别。我重写了参数以强调数组是参与的,当你以这种方式看待它时它是有意义的,但最终你需要理解重写函数abc内部的参数{{1}而且abc实际上仍然是指针,但它也是有效的,也是有意义的。

答案 4 :(得分:0)

首先,char * p =“Hello XYZ”和char * q =“ABC”,它们都是字符串常量,你不能修改这些点指向的值。

正确的方法是修改字符串,你可以使用arry类型,或者malloc一些记忆来存储字符串。