【问题标题】:Replace char inside character array替换字符数组中的字符
【发布时间】:2014-07-24 23:48:27
【问题描述】:

以下代码中止并在注释行出现分段错误错误。该行旨在对一个字符进行简单替换。

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

int num(char zf[], int n) {
    int i;

    for (i = 0; i < n; i++) {
        // assignment = seg fault
        if (zf[i] == ',') zf[i] = '.';

        if (!isdigit(zf[i]) && zf[i] != '+' && zf[i] != '-' && zf[i] != '.') {
            return 0;
        }
    }

    return 1;
}

int main(void) {
    if (num("-3+3,0", 6)) {
        printf("valid\n");
    } else {
        printf("not valid\n");
    }

    return 0;
}

我正在寻找解释为什么会出现错误以及解决方案是什么?字符串?函数num的参数和数据类型不能改变。

【问题讨论】:

  • 修改字符串文字是未定义的行为。这是一个有类似问题的问题(还有更多):stackoverflow.com/questions/943312/…
  • 是的,字符串字面量是常量。
  • 搞笑,这是模拟考试,“num(char zf[], int n)”是老师提供的。完全不知道如何解决这个问题。
  • @thpetrus,不要给它一个字符串文字。给它一些它可以实际修改的东西。

标签: c


【解决方案1】:

字符串文字被编译到程序中并作为字节数组存储在二进制文件中的某个位置。您可以尝试在 Linux 中使用 strings 命令在二进制文件中查找字符串文字。

字符串常量很可能存在于程序的只读部分中,这就是为什么修改它们是未定义行为的原因。当您尝试访问或修改不应访问或修改的内存部分时,会发生分段错误。

【讨论】:

  • @TheParamagneticCroissant:我稍微改了一下文字。
【解决方案2】:

尽管在 C 中字符串文字具有非常量字符数组的类型,但 C 标准不允许更改它们。

4 同样的考虑适用于序列中的每个元素 字符串文字,就好像它在 整数字符常量

中一样

如果程序尝试修改字符串文字,则其行为未定义

你应该通过以下方式定义 main

int main(void) {
    char s[] = "-3+3,0";

    if (num(s, sizeof( s ) - 1 )) {
        printf("valid\n");
    } else {
        printf("not valid\n");
    }
    return 0;
}

【讨论】:

    【解决方案3】:

    if (num("-3+3,0", 6)) 中,"-3+3,0" 存储在只读内存中。所以修改它,会导致分段错误。

    使用数组将"-3+3,0" 存储在堆栈中。然后我们可以修改这些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2017-12-17
      • 2014-12-31
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      相关资源
      最近更新 更多