char *,strcat interaction。为什么它不打印任何东西

时间:2018-06-04 21:55:15

标签: c

它什么都不打印。我认为问题出在char *类型,但我不知道是否以及为什么。

&.

2 个答案:

答案 0 :(得分:1)

strcat修改destination参数缓冲区but a's buffer is in read-only memory as it's a string literal

解决方案是在运行时创建缓冲区并将其用作缓冲区。当然,您需要先将a复制到其中。

char* a = "1234567890";
char* b = "abcdefghij";

size_t aLen = strlen( a );

char* combined = malloc( sizeof(char) * ( strlen(a) + strlen(b) + 1 ) );
strcpy_s( combined, aLen, a ); // always use _s versions of string/buffer functions!
strcat( combined, b );

puts( combined );

free( combined );

或者在C99中,我们可以使用预先初始化的堆栈分配数组(并预先分配足够大)。堆栈数组,包括预先初始化的堆栈数组,可以将其缓冲区写入:

char a[100] = "1234567890";
strcat( a, "abcdefghij" );
puts( a );

答案 1 :(得分:0)

你不能把字符串字符串作为目标。使用数组作为dest缓冲区

char str[30] = "Ala ";
const char *strFrom = "ma kota";
strcat (str, strFrom);

编辑:扩展答案

看看如何编译字符串文字: https://godbolt.org/g/hZuR1o

数组缓冲区是内联定义的,它的值是在执行期间构造的,位于堆栈中。因此缓冲区本身可以自由修改。

如果你动态分配它(使用malloc或calloc),你就会得到一个指向堆上缓冲区的指针,也可以修改它。

另一方面,字符串文字落在只读存储器区域中,并且在各种实例之间共享,因为它们无论如何都是只读的。这就是它的设计方式,男人:)