Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法将字符添加到指定给“的字符指针”&引用;_C_Pointers_Char_Append_C Strings - Fatal编程技术网

C 无法将字符添加到指定给“的字符指针”&引用;

C 无法将字符添加到指定给“的字符指针”&引用;,c,pointers,char,append,c-strings,C,Pointers,Char,Append,C Strings,假设我有这个密码 char *string = ""; string += 'A'; string += 'B'; string += 'C'; printf("%s\n", string); 它只是打印一条空行。为什么要这样做?如果我不知道字符串的长度,有没有一种简单的方法来连接从空字符串开始的单个字符?string只是一个指向字符串文本的指针”,所以当你用+添加字符时,实际上,您只是移动指针,而不是连接到字符串。在C语言中,您可以分配足够大的字符串,并使用strcat向其中添加字符串: c

假设我有这个密码

char *string = "";
string += 'A';
string += 'B';
string += 'C';
printf("%s\n", string);

它只是打印一条空行。为什么要这样做?如果我不知道字符串的长度,有没有一种简单的方法来连接从空字符串开始的单个字符?

string
只是一个指向字符串文本的指针
,所以当你用
+
添加
字符时,实际上,您只是移动指针,而不是连接到字符串。在C语言中,您可以分配足够大的字符串,并使用
strcat
向其中添加字符串:

char字符串[100]=“”;
strcat(字符串“A”);
strcat(字符串“B”);
strcat(字符串,“C”);
printf(“%s\n”,字符串);

如果您想使用字符,那么可以先使用。

代码>字符串+='A'
不向字符串追加字符,它通过
'a'
的值将
字符
指针
字符串
递增,在使用ASCII的系统上,该值为65,使
字符串
指向远远超出
字符串文字结尾的位置。因此,此代码具有未定义的行为

printf(“&s\n”,字符串)应打印
&s
和换行符

假设您在问题中输入了错误的代码,
printf(“%s\n”,string)
将具有未定义的行为,并且打印空行是可能的,还有崩溃或任何其他令人讨厌的副作用

如果要一次构造一个字符的字符串,请使用以下命令:

char buf[20];
char *string = buf;
*string++ = 'A';
*string++ = 'B';
*string++ = 'C';
*string = '\0';    // set the null terminator
printf("%s\n", buf);
相反,您可以对字符串文本使用
strcat

char字符串[20]=“”;
strcat(字符串“A”);
strcat(字符串“B”);
strcat(字符串,“C”);
printf(“%s\n”,字符串);

在这样的语句中

string += 'A';
这里使用了指针算法。字符“A”的内部表示形式的值被添加到指针
字符串的值中,因此指针的值无效,因为它没有指向实际对象

例如,您需要声明一个字符数组

char string[4] = "";
int i = 0'
string[i++] = 'A';
string[i++] = 'B';
string[i++] = 'C';
string[i] = '\0';

printf("%s\n", string);
然后可以将数组的各个元素设置为字符文字,例如

char string[4] = "";
int i = 0'
string[i++] = 'A';
string[i++] = 'B';
string[i++] = 'C';
string[i] = '\0';

printf("%s\n", string);
你在这通电话中也有输入错误

printf("&s\n", string);
如果字符数组已包含类似

char string[4] = "AB";
您希望在字符串的末尾附加一个字符,然后可以使用字符文本进行写入

size_t n = strlen( string );
string[n] = 'C';
string[n + 1] = '\0';
或者,您可以使用字符串文字和标准的C函数
strcat
like

strcat( string, "C" );
在任何情况下,字符数组应有足够的空间容纳新字符

它只是打印一条空行

不幸的是,代码的未定义行为显示为打印一个明显的空字符串,这并不奇怪。如果它抛出一个segfault,或者其他一些与内存相关的冲突,那么它将更能说明问题的性质,这是完全合适的

为什么会这样

因为您是在指针上执行算术运算,而不是修改指针指向的对象。这句话

。。。使用整型字符常量
'A'
(其数值取决于系统,但通常是大写字母A的ASCII码)计算
字符串的指针加法,并将结果指针存储在
字符串中。这使得
string
指向与以前不同的内容。它不会以任何方式修改
string
指向的内存内容

有没有一个简单的方法 连接从空字符串开始的单个字符的方法,如果 我不知道要多久

如果您对数据的长度有一个上限,那么最简单的方法就是声明一个足够大的数组来包含数据,并将其初始化为零

char string[MAX_LEN + 1] = {0};
然后,您可以通过将单个字符写入下一个可用索引(您可以跟踪该索引,也可以根据需要通过
strlen()
计算该索引)来添加单个字符:

请注意,这依赖于零初始化(对于局部变量来说不是自动的),以确保数组内容始终包含以null结尾的字符串。完成此操作后,您可以打印预期结果:

printf("%s\n", string);

如果您事先不知道字符串长度的合理上限,或者如果上限非常大,则需要依赖于动态内存分配和重新分配。这是一个可以推迟到以后讨论的主题。

string+='a'是错误的,原因很多。您需要做的是查看
malloc
realloc
(完全忘记使用
+=
)来连接两个字符串如果您想逐字符设置字符串,从一个足够大的缓冲区开始,逐个设置每个字符。你来自Java吗?@UnholySheep我已将其更改为在字符指针上使用calloc。既然我有了它,我怎么能设置分配给我正在阅读的字符的不同内存地址呢?@Jens yea我来了Java@chqrlieforyellowblockquotes谢谢这是由于复制和粘贴。谢谢。这看起来是我需要的。还有,很抱歉我的打字错误。这不是我的代码,只是我的问题。