连接字符串时的C分段错误(核心转储)

时间:2014-11-06 20:07:55

标签: c string pointers concatenation

我正在尝试在C中编写一个程序,它接受三个字符指针,其中两个是用户输入的字符串,最后一个字符串是用户想要写入连接字符串的最后一个字符串。我对内存管理知之甚少,但被告知我必须使用malloc * 250来获取每个字符串的大小。我还被告知我必须使用指针来解决这个问题。

无论如何,在通过scanf输入两个字符串后,我得到一个Segmentation Fault(核心转储)错误,没有其他解释。我猜它与我在str_concat函数中引用指针的方式有关,但我不知道从哪里开始。

这是我的代码,包括str_concat函数:

#include <stdio.h>
#include <stdlib.h>

void str_concat(char* str1, char* str2, char* str);

int main() {
        char* str1;
        char* str2;
        char* finalString;
        str1 = malloc(sizeof(char)*250);
        str2 = malloc(sizeof(char)*250);
        finalString = malloc(sizeof(char)*250);
        // input
        printf("Enter string 1: ");
        scanf("%s", str1);
        printf("Enter string 2: ");
        scanf("%s", str2);
        // concatenate
        str_concat(str1, str2, finalString);
        printf("Final string: %s\n", finalString);
        free(str1);
        free(str2);
        free(finalString);

        return 0;
}

void str_concat(char* str1, char* str2, char* str) {
        // go through string 1 up until terminating character
        while(*str1 != '\0') {
                *str = *str1; // copy str1 to final string up until the terminating character
                str++; // increment position of final string
        } // end while
        while(*str2 != '\0') {
                *str = *str2; // copy string 2 starting at final position of string 1
                str++; // increment position of final string
                str2++; // increment string 2 so we can go through values
        } // end while
        *str = '\0'; // add a null terminating character to the string to finish
}

2 个答案:

答案 0 :(得分:2)

你的功能错了。你忘了在循环中增加指针str1

    while(*str1 != '\0') {
            *str = *str1; // copy str1 to final string up until the terminating character
            str++; // increment position of final string
    } // end while

该功能可以写得更简单

char * str_concat( const char *str1, const char *str2, char *str ) 
{
    char *p = str;

    while ( *p = *str1++ ) ++p;
    while ( *p = *str2++ ) ++p;

    return str; 
}

考虑到字符串函数通常遵循通用约定,根据该约定,它们返回指向字符串的指针。

答案 1 :(得分:-1)

你的 finalString 应该是str1和str2加一的长度之和。

str1 = malloc(sizeof(char)*250);
str2 = malloc(sizeof(char)*250);
finalString = malloc(sizeof(char)*501);