无法将字符添加到分配给“”的字符指针
Cant add characters to a char pointer assigned to ""
说我有这个代码
char *string = "";
string += 'A';
string += 'B';
string += 'C';
printf("%s\n", string);
它只是打印一个空行。为什么要这样做,如果我不知道要多长时间,是否有一种简单的方法可以连接从空字符串开始的单个字符?
string
只是一个指向字符串文字 ""
的指针,所以当你添加一个 char
和 +
时,你实际上只是在移动指针连接到字符串。在 C 中,您可以分配足够大的字符串并使用 strcat
将字符串添加到其中:
char string[100] = "";
strcat(string, "A");
strcat(string, "B");
strcat(string, "C");
printf("%s\n", string);
如果你想使用字符,那么你可以先convert the char to a string。
string += 'A';
不 向字符串附加一个字符,它将char
指针string
递增[=15] =] 在使用 ASCII 的系统上是 65 并且使 string
指向远远超出 ""
字符串文字的末尾。因此这段代码有未定义的行为。
printf("&s\n", string);
应该打印 &s
和一个换行符。
假设您在问题中输入错误的代码,printf("%s\n", string);
会出现未定义的行为,并且可能会打印一个空行,以及崩溃或任何其他令人讨厌的副作用。
如果您想一次构造一个字符串,请使用:
char buf[20];
char *string = buf;
*string++ = 'A';
*string++ = 'B';
*string++ = 'C';
*string = '[=10=]'; // set the null terminator
printf("%s\n", buf);
相反,您可以将 strcat
与字符串文字一起使用:
char string[20] = "";
strcat(string, "A");
strcat(string, "B");
strcat(string, "C");
printf("%s\n", string);
在这样的陈述中
string += 'A';
这里用到了指针运算。字符 'A' 的内部表示的值被添加到指针 string
的值,结果指针具有无效值,因为它没有指向实际对象。
您需要声明一个字符数组,例如
char string[4] = "";
然后你可以将数组的各个元素设置为字符文字,例如
int i = 0'
string[i++] = 'A';
string[i++] = 'B';
string[i++] = 'C';
string[i] = '[=12=]';
printf("%s\n", string);
另外你这个电话打错了
printf("&s\n", string);
如果一个字符数组已经包含了一个像
这样的字符串
char string[4] = "AB";
并且您想在字符串的末尾附加一个字符,那么您可以使用字符文字来编写
size_t n = strlen( string );
string[n] = 'C';
string[n + 1] = '[=15=]';
或者您可以使用字符串文字和标准 C 函数 strcat
,例如
strcat( string, "C" );
在任何情况下,字符数组都应有足够的 space 来容纳新字符。
It just prints an empty line.
你很不幸,但并不奇怪,你的代码的未定义行为表现为打印一个明显为空的字符串。如果它抛出段错误或其他一些与内存相关的违规行为,那将更能说明问题的性质,这是完全合适的。
Why does it do this
因为你是在指针上进行运算,而不是修改它指向的东西。这个表达式...
string += 'A';
... 计算 string
与整数字符常量 'A'
的指针加法(其数值取决于系统,但通常是大写字母 A 的 ASCII 码),并存储string
中的结果指针。这使得 string
指向与之前不同的东西。它不会以任何方式修改 string
指向的内存内容。
and is there an easy
way to concatenate single characters starting from an empty string if
I don't know how long it'll be?
如果您对数据的长度有一个上限,那么最简单的事情就是声明一个足够大的数组来包含数据并将其初始化为全零 ...
char string[MAX_LEN + 1] = {0};
然后您可以通过将其写入下一个可用索引来添加单个字符(您可以通过 strlen()
跟踪或根据需要计算该索引):
unsigned next_index = 0;
string[next_index++] = 'A';
string[next_index++] = 'B';
string[next_index++] = 'C';
请注意,这依赖于零初始化——这对局部变量不是自动的——以确保数组内容始终包含一个 null-terminated 字符串.完成后,您可以打印预期结果:
printf("%s\n", string);
如果您事先不知道字符串可能有多长的合理上限,或者如果上限非常大,那么您将需要依靠动态内存分配和重新分配。这是你推迟到以后的主题。
说我有这个代码
char *string = "";
string += 'A';
string += 'B';
string += 'C';
printf("%s\n", string);
它只是打印一个空行。为什么要这样做,如果我不知道要多长时间,是否有一种简单的方法可以连接从空字符串开始的单个字符?
string
只是一个指向字符串文字 ""
的指针,所以当你添加一个 char
和 +
时,你实际上只是在移动指针连接到字符串。在 C 中,您可以分配足够大的字符串并使用 strcat
将字符串添加到其中:
char string[100] = "";
strcat(string, "A");
strcat(string, "B");
strcat(string, "C");
printf("%s\n", string);
如果你想使用字符,那么你可以先convert the char to a string。
string += 'A';
不 向字符串附加一个字符,它将char
指针string
递增[=15] =] 在使用 ASCII 的系统上是 65 并且使 string
指向远远超出 ""
字符串文字的末尾。因此这段代码有未定义的行为。
printf("&s\n", string);
应该打印 &s
和一个换行符。
假设您在问题中输入错误的代码,printf("%s\n", string);
会出现未定义的行为,并且可能会打印一个空行,以及崩溃或任何其他令人讨厌的副作用。
如果您想一次构造一个字符串,请使用:
char buf[20];
char *string = buf;
*string++ = 'A';
*string++ = 'B';
*string++ = 'C';
*string = '[=10=]'; // set the null terminator
printf("%s\n", buf);
相反,您可以将 strcat
与字符串文字一起使用:
char string[20] = "";
strcat(string, "A");
strcat(string, "B");
strcat(string, "C");
printf("%s\n", string);
在这样的陈述中
string += 'A';
这里用到了指针运算。字符 'A' 的内部表示的值被添加到指针 string
的值,结果指针具有无效值,因为它没有指向实际对象。
您需要声明一个字符数组,例如
char string[4] = "";
然后你可以将数组的各个元素设置为字符文字,例如
int i = 0'
string[i++] = 'A';
string[i++] = 'B';
string[i++] = 'C';
string[i] = '[=12=]';
printf("%s\n", string);
另外你这个电话打错了
printf("&s\n", string);
如果一个字符数组已经包含了一个像
这样的字符串char string[4] = "AB";
并且您想在字符串的末尾附加一个字符,那么您可以使用字符文字来编写
size_t n = strlen( string );
string[n] = 'C';
string[n + 1] = '[=15=]';
或者您可以使用字符串文字和标准 C 函数 strcat
,例如
strcat( string, "C" );
在任何情况下,字符数组都应有足够的 space 来容纳新字符。
It just prints an empty line.
你很不幸,但并不奇怪,你的代码的未定义行为表现为打印一个明显为空的字符串。如果它抛出段错误或其他一些与内存相关的违规行为,那将更能说明问题的性质,这是完全合适的。
Why does it do this
因为你是在指针上进行运算,而不是修改它指向的东西。这个表达式...
string += 'A';
... 计算 string
与整数字符常量 'A'
的指针加法(其数值取决于系统,但通常是大写字母 A 的 ASCII 码),并存储string
中的结果指针。这使得 string
指向与之前不同的东西。它不会以任何方式修改 string
指向的内存内容。
and is there an easy way to concatenate single characters starting from an empty string if I don't know how long it'll be?
如果您对数据的长度有一个上限,那么最简单的事情就是声明一个足够大的数组来包含数据并将其初始化为全零 ...
char string[MAX_LEN + 1] = {0};
然后您可以通过将其写入下一个可用索引来添加单个字符(您可以通过 strlen()
跟踪或根据需要计算该索引):
unsigned next_index = 0;
string[next_index++] = 'A';
string[next_index++] = 'B';
string[next_index++] = 'C';
请注意,这依赖于零初始化——这对局部变量不是自动的——以确保数组内容始终包含一个 null-terminated 字符串.完成后,您可以打印预期结果:
printf("%s\n", string);
如果您事先不知道字符串可能有多长的合理上限,或者如果上限非常大,那么您将需要依靠动态内存分配和重新分配。这是你推迟到以后的主题。