2013-07-13 123 views
1

由于下面的代码给出(分段错误)错误(在运行时),我该如何实现仅使用指针的串联?使用指针的字符串连接

#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    char *s1="Front"; 
    char *s2="Back"; 
    char *s3=strcat(s1,s2); 
    puts(s3); 
    return 0; 
} 
+0

什么是错误? – Femaref

回答

4

因为你试图写一个字符串。行char *s1 = "Front";指向一个不能写入的字符串常量。

将其更改为char s1[20] = "Front";,它应该像您期望的那样工作 - 只要您添加的字符数不超过14个。

+0

谢谢!得到它了! – chappa

1

阅读有关strcat呢,牢记文字字符串(如"Front""Back")不可修改。

+0

+1为'不可修改'部分。 –

1

你需要空间的结果,就像这样:

#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    char *s1="Front"; 
    char *s2="Back"; 
    char s3[80]; 
    s3[0] = '\0'; 
    strcat(s3,s1); 
    strcat(s3,s2); 
    puts(s3); 
    return 0; 
} 
+0

为什么初始化s3 [0] = 0?对不起,如果这是一个天真的问题! – chappa

+0

'strcat()'将数据添加到以空字符结尾的字符串的末尾; 's3 [0] ='\ 0';'确保's3'在连接开始之前是一个空的空字符串。 –

+0

@JonathanLeffler - 我相信我的代码编译得很好。不想现在就去K + R找到参考。 – Hogan

1

该代码给出错误,因为连接s1s2将要求s1的分配内存大于两个字节数组的组合长度。 strcat将尝试迭代未分配给s1的内存,从而导致运行时错误。这将通过指针的唯一方法是,如果你让str3一个字符数组,其中规模在编译时(或指向一个动态分配一个用于运行时)知道:

char s1[10] = "Front"; 
char *s2 = "Back"; 

char *s3 = strcat(s1, s2); 
0

你能做到这也是。虽然它不比strcat()更好,但它仅使用指针实现。

#include<stdio.h> 
#define SIZE 20 
void concat(char *,char *); 

int main() 
{ 
    char string1[SIZE]="\0",string2[SIZE]="\0"; 

    printf("Enter String 1:\n"); 
    gets(string1); 
    printf("Enter String 2:\n"); 
    gets(string2); 

    concat(string1,string2); 

    return 0; 
} 
void concat(char *str1,char *str2) 
{ 
    char *conc=str1; 

    while(*str1!='\0') 
     str1++; 

    *str1=' '; 
    ++str1; 

    while(*str2!='\0') 
    { 
     *str1=*str2; 
     str1++,str2++; 
    } 

    *str1='\0'; 
    printf("Concatenated String:\n"); 
    puts(conc); 

}