我试图实现以下代码。
/favicon.ico
我相信我正在修改引用,我期待输出
"你好ABC"
但输出是
" Hello XYZ"。
任何人都可以解释错误吗?
答案 0 :(得分:3)
p
更改q
或abc()
。要实际更改p
和q
本身,您需要将指针传递给每个人。p=q;
不是复制字符串的方法。您需要使用strcpy()
复制字符串。abc()
,这些参数是字符串文字的指针。如果您尝试修改这些输入参数所指向的值,那么您将面对undefined behaviour。答案 1 :(得分:1)
首先,你有一个多余的**
尾随。
其次,函数abc
修改按值传递给它的指针p
,然后抛弃结果。为什么你会期待任何不同的行为?
答案 2 :(得分:1)
p
和q
指向只读字符串文字。
尝试更改他们指向的数据是未定义的行为。您可以更改p
和q
指向的内容(即重新分配指针很好)。
幸运的是,您没有在函数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一些记忆来存储字符串。