C语言 与字符串作斗争.我的函数有什么问题



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

总线错误: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] != '') {
        string_trimmed[j] = string[i];
        i++;
        j++;
    }
    string_trimmed[j] = '';
    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] != '') {
        string_trimmed[j] = string[i];
        i++;
        j++;
    }
    string_trimmed[j] = '';
    printf("cn");
    strcpy(string, string_trimmed);
}

stringstring_trimmed 都指向字符串文字,此处为 main

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

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

在函数trim_string中,您正在修改它们,这是未定义的行为,总线错误是一种可能的结果,尽管任何事情都可能发生。

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 段说(强调我的(:

如果这些数组的元素具有 适当的值。如果程序尝试修改这样的数组,则行为为 定义。

最新更新