苦苦挣扎。我的功能出了什么问题?

时间:2013-12-02 22:37:45

标签: c undefined-behavior string-literals

我正在尝试编写一个小函数来修剪字符串中的左侧空格,但我无法正确。在这个版本中,我收到以下错误:

  

总线错误:10

有人可以向我解释我做错了什么吗?我并不是在寻找替代代码,而是希望了解代码中的错误:

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


void trim_string(char *);

int main(int argc, char *argv[]) {

    char *temp = "   I struggle with strings in C.\n";
    trim_string(temp);
    printf("%s", temp);

    return 0;
}


void trim_string(char *string) {
    char *string_trimmed = "";
    int i=0, j=0;

    while (isblank(string[i])) {
        i++;
    }
    while (string[i] != '\0') {
        string_trimmed[j] = string[i];
        i++;
        j++;
    }
    string_trimmed[j] = '\0';
    strcpy(string, string_trimmed);
}

我现在找到了一个解决方案,如下所示。但我一开始还不太清楚我做错了什么:

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

#define MAX_LENGTH 100

void trim_string(char [MAX_LENGTH]);

int main(int argc, char *argv[]) {

    char temp[MAX_LENGTH] = "   I struggle with strings in C.\n";
    trim_string(temp);
    printf("%s", temp);

    return 0;
}


void trim_string(char string[MAX_LENGTH]) {
    char string_trimmed[MAX_LENGTH];
    int i=0, j=0;

    while (isblank(string[i])) {
        i++;
    }
    while (string[i] != '\0') {
        string_trimmed[j] = string[i];
        i++;
        j++;
    }
    string_trimmed[j] = '\0';
    printf("c\n");
    strcpy(string, string_trimmed);
}

1 个答案:

答案 0 :(得分:1)

stringstring_trimmed都指向字符串文字,在main中:

char *temp = "   I struggle with strings in C.\n";
             ^
             |
             This is a string literal

temp指向字符串文字,标准表示您不允许修改它们。

在函数trim_string中,您正在修改它们undefined behavior,其中一个总线错误是一个可能的结果,尽管可能发生任何事情。

string_trimmed要么必须是这样的数组:

char string_trimmed[n] ;

其中n是使用strlen(string)输入的大小可能有意义或通过malloc动态分配,您需要在函数结束时释放。来自main的输入也是如此,这可以替代:

char temp[] = "   I struggle with strings in C.\n";

为了完整起见,草案C99标准部分6.4.5 字符串文字 6 表示(强调我的):

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观如果程序试图修改这样的数组,则行为是   未定义。