我正在进行一些练习,并尝试仅使用指针(没有char数组)连接两个字符串。 我的代码似乎编译(注意:我使用的是旧的16位Open Watcom编译器):
#include <stdio.h>
int main(){
char *str1 = "first";
char *str2 =" second";
strcat2(str1,str2);
for(;*str1!='\0';str1++){
printf(str1);
}
return 0;
}
int strcat2(char *s,char *t){
for(;*s!='\0';s++){
;
}
while((*s++ = *t++)!='\0'){
;
}
*t++;
t='\0';
return 0;
}
当我试图运行它时没有任何反应。 我相信我的上述工作是非常有缺陷的。任何建议和帮助将不胜感激。
答案 0 :(得分:4)
您声明的str1
和str2
是字符串文字,无法修改。在Linux可执行文件中,str1
和str2
指向的地址的内容存储在可执行文件的.rodata
部分中,该部分是不可写的。在其他可执行文件中,内容存储在不可写的类似位置。您应该使用数组或动态分配的内存区域来完成此工作。确保在连接要粘贴的字符串时,另一个字符串有足够的空间来容纳它们。
<强> EDIT1:强>
要么
char str1[BUFF_SIZ] = "Hello", str2[BUFF_SIZ] = " Man";
/* Now do strcat */
/* The strlen (str1) + strlen (str2) should be lessthan BUFF_SIZ */
或
char *str1, *str2;
str1 = malloc (sizeof (char) * BUFF_SIZ);
str1 = malloc (sizeof (char) * BUFF_SIZ);
strcpy (str1, "Hello");
strcpy (str1, " Man");
/* Now do strcat */
/* The strlen (str1) + strlen (str2) should be lessthan BUFF_SIZ */
答案 1 :(得分:1)
您的代码无效。为了迂腐,它会调用未定义的行为,因为您正在尝试修改字符串文字的内容。
char *str1 = "first";
char *str2 =" second";
str1
指向驻留在const内存位置的“first”。
要获得指向字符串文字的指针,您应该拥有一个具有足够容量的字符数组,以便保存连接字符串"firstsecond"
这符合期望
#include <stdio.h>
int strcat2(char *s,char *t){
for(;*s!='\0';s++){
}
while((*s++ = *t++)!='\0'){
}
t='\0';
return 0;
}
int main(){
char str1[15] = "first";
char *str2 =" second";
strcat2(str1,str2);
printf("%s",str1);
return 0;
}
在线演示here
答案 2 :(得分:0)
来自man:strcat:
char * strcat ( char * destination, const char * source );
...
Parameters
destination
Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.
您的目标字符串不够大。
答案 3 :(得分:0)
你需要一个可写且足够大的缓冲区来写入,就像这样
char str1[32] = "first";