替换字符数组中的char

时间:2014-07-23 19:09:46

标签: c

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

#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;
}

我正在寻找一个解释为什么会出现错误以及解决方案是什么? strncpy()函数?函数num的参数和数据类型不得更改。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

  

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

中一样

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

您应该按以下方式定义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;
}

答案 2 :(得分:0)

此处if (num("-3+3,0", 6))&#34; -3 + 3,0&#34; 存储在只读内存中。因此修改它会导致分段错误。

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

相关问题