我想在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。
这里的区别在于,在以前的情况下,str
是char
数组,而在后一种情况下,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;
}