C-截断字符串导致分割故障



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

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

如果您这样调用您的功能:

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

它可以正常工作。但是,如果您这样称呼:

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

可能导致segfault。

这里的区别在于,在以前的情况下,strchar数组,而在后一种情况下,str是指定字符串常数的指针。字符串常数通常生活在仅读取的内存部分中,因此试图修改它会导致核心转储。

您的程序应该是这样的:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void foo(char **value) {
    if (strlen(*value)>32) {
        printf("%cn", (*value)[32]);
        (*value)[32] = ''; // You want the string length to be 32, so set 32th character to '' 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 %sn", str);
    free(str);
    return 0;
}

相关内容

  • 没有找到相关文章