segfault附加一个空字符串C.

时间:2018-04-17 06:00:06

标签: c string algorithm segmentation-fault append

我正在尝试附加一个包含特定字符的字符串。我从我的信念中得到了一个段错误,因为我试图附加到一个内存地址,我不知道如何改变它。

以下是我在调试时显示的错误

  

print:6

     

要附加的词: Z H E

     

分段错误(核心转储)

这是与segfault相对应的代码

void append(char* s, char c){

        printf("print: 5\n");
        int len = strlen(s);

        printf("print: 6\n");
        printf("word to be appended: %s\n", s);
        s[len] = c;

        printf("print: 7\n");
        s[len+1] = '\0';
}

这是对上面函数的调用是在这组代码的底部与相应的变量初始化

    int x;
    char *tempLine = NULL;
    char *token = NULL;
    char *punctuationChar;
    size_t length = 0;
    int charCount = 0;
    char *word;
    int i;
    int p;
    int check = 0;
    struct node *curr = NULL;
    struct node *newNode = NULL;

    (*head) = malloc(sizeof(struct node));   
    curr = (*head);     

    rewind(stream);

    for(x = 0; x < size; x++){

            getline(&tempLine, &length, stream);
            token = strtok(tempLine, " ");
            if(x == 0){

                    charCount = strlen(token);
                    curr -> word = malloc(charCount *(sizeof (char)) + 1);
                    strcpy(curr -> word, token);
                    token = strtok(NULL, " ");

            }else{   

            while(token != "\n"){

                    check = 0;
                    printf("token: %s\n", token);
                    charCount = strlen(token);
                    printf("print: 1\n");

                    //check for punctuation aka, last word on line
                    for(i = 0; i < charCount; i++){
                            printf("iteration: %d\n", x);
                            if(ispunct(token[i])){

                                    printf("print: 2\n");
                                    append(punctuationChar, token[i]);
                                    check = 1;

1 个答案:

答案 0 :(得分:2)

您致电append(punctuationChar, token[i]),但punctionatChar尚未初始化。这会产生不确定的行为。

为了解决这个问题,让punctuationChar指向一个正确分配的内存空间,用一个有效的字符串初始化,即一个带字符串终止字符的字符串;

要尝试一下,你可以简单地开始:

char tempBuffer[100] = "something to start with";
char* punctationChar = tempBuffer;

这不会解决程序流程中可能出现的问题;但它应该显示你的问题的根本原因。