#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str1 = "Bangladesh Bogus Party";
char *str2 = "Sad is a beautiful Country";
strcpy(str1 + 11, str2 + 4);
strcat(str1, "! !! !!!");
printf("\n%s", str1);
return 0;
}
在代码块中,它找到了....
-------------- Build: Debug in catcpy (compiler: GNU GCC Compiler)---------------
Target is up to date.
Nothing to be done (all items are up-to-date).
-------------- Run: Debug in catcpy (compiler: GNU GCC Compiler)---------------
Checking for existence: E:\Sobar Jonno C (Niton)\String\catcpy\bin\Debug\catcpy.exe
Executing: "C:\Program Files (x86)\CodeBlocks/cb_console_runner.exe" "E:\Sobar Jonno C (Niton)\String\catcpy\bin\Debug\catcpy.exe" (in E:\Sobar Jonno C (Niton)\String\catcpy\.)
答案 0 :(得分:3)
您无法覆盖str1
指向string literal because they are read only memory的指针,并且您的程序正在尝试写入内存,指针指向未定义行为的大部分指针时间导致分段错误。如果没有事先分配必要的空间,你甚至无法连接。
如果您希望代码正常工作,则需要具备此类代码
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[42] = "Bangladesh Bogus Party";
const char *str2 = "Sad is a beautiful country";
strcpy(str1 + 11, str2 + 4);
strcat(str1, "! !! !!!");
printf("%s\n", str1);
return 0;
}
请注意,str1
不再是字符串文字,而是str2
。这是因为str2
永远不会被修改,我添加了const
说明符以防止意外地执行它。完全阻止这种情况是不可能的,但const
可以帮助您在无意中执行此操作时发现。
答案 1 :(得分:2)
主要问题是str1
指向字符串文字。它们位于内存的只读部分,因此尝试更改它们通常会导致程序崩溃。不是将str1
定义为指针,而是将其定义为使用相关文字初始化的数组:
char str1[] = "Bangladesh Bogus Party";
但是,如果执行此操作,则阵列没有足够的空间来添加额外的字符。所以让数组变大,以便有足够的空间:
char str1[50] = "Bangladesh Bogus Party";
答案 2 :(得分:0)
strcpy
和strcat
都要求第一个操作数指向可写且足以容纳结果的内存。
在您的情况下,这些要求均未得到满足。
编译器通常将字符串文字置于写保护的内存中。 gcc
将字符串文字放在写保护的内存中。其他编译器可以采用不同的方式。
问题可以通过在可写内存中创建str1
并增加其大小来解决,以便它足以容纳整个字符串。
字符串终结符的结果字符串为41个字符+ 1。
以下是一些不同的方法:
char str1[42] = "Bangladesh Bogus Party"; // Declare str1 as an array
或
char *str1 = malloc(42); // Allocate str1 dynamically
strcpy(str1, "Bangladesh Bogus Party"); // and copy the string to it
或
char *str1 = strdup("Bangladesh Bogus Party"); // Allocate str1 dynamically and copy the string to it. It will only be just big enough to hold the initial data
str1 = realloc(str1, 42); // Increase the size to 42.