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谢谢这是由于复制和粘贴。谢谢。这看起来是我需要的。还有,很抱歉我的打字错误。这不是我的代码,只是我的问题。