截断字符串会导致分段错误

时间:2017-03-12 03:43:44

标签: c string char segmentation-fault truncate

我想在C中编写一个函数,将输入字符串截断为32个字符,但下面的代码给出了一个分段错误。谁能解释为什么会这样呢?

void foo (char *value){
    if (strlen(value)>32) {
        printf("%c\n", value[31]); // This works
        value[31] = '\0';          // This seg faults
    }
}

2 个答案:

答案 0 :(得分:6)

如果您按照以下方式调用您的函数:

char str[] = "1234567890123456789012345678901234567890";
foo(str);

它会正常工作。但如果你这样称呼它:

char *str = "1234567890123456789012345678901234567890";
foo(str);

这可能导致段错误。

这里的区别在于前一种情况strchar数组,而后一种情况str是指向字符串常量的指针。字符串常量通常位于内存的只读部分,因此尝试修改它会导致核心转储。

答案 1 :(得分:0)

你的程序应该是这样的:

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

void foo(char **value) {
    if (strlen(*value)>32) {
        printf("%c\n", (*value)[32]);
        (*value)[32] = '\0'; // You want the string length to be 32, so set 32th character to '\0' so 32 characters will be from 0 to 31
    }
}

int main() {
    char *str;
    str = malloc(100); // Change 100 to max possible length of string user can enter

    printf("Enter string : ");
    scanf("%s", str);

    foo(&str);

    printf("Truncated string is %s\n", str);

    free(str);

    return 0;
}