c - 与弦作斗争。我的功能出了什么问题?

标签 c undefined-behavior string-literals

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

bus error: 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);
}

最佳答案

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

It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

关于c - 与弦作斗争。我的功能出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20339301/

相关文章:

c++ - 在尝试使用 SFINAE 禁用功能时,我是否创建了未定义的行为?

c++11 - 编译时文字字符串作为模板参数

c++ - 字节顺序是在编译时决定的吗?

c++ - 如果在执行期间替换二进制文件, "const"数组是否驻留在内存中?

c - 静态的生命周期真的在程序执行时开始吗?

我可以在此函数中使用 restrict 限定符吗?

c++ - 将字符串文字常量定义为 char const* 和 wchar const*

C++ 比较两个字符串文字

java - 使用 Windows 服务调用使用 JNI 和 LoadLibrary 的 Java 程序的问题

c - C 中的多表达式宏