我正在尝试创建一个函数guilabel_wrap(char *buffer, int maxlen)
,它接受一个字符串和一个长度的指针,然后修改字符串以插入\ n,以便字符串永远不会超过长度,这样
char* guilabel = "Hello, world! How are you doing?";
guilabel_wrap(guilabel, 15);
printf("%s", guilabel);
将打印
Hello, world!
How are you
doing?
我已经提出了下面的函数,它使用gcc编译,但会导致分段错误。我怀疑问题出在第二个while循环和我对指针的理解失败。
void guilabel_wrap(char* buffer, int maxlen) {
char *pos;
char *end;
pos = buffer;
end = (pos + strlen(buffer));
while ((end - pos) > maxlen) {
pos += maxlen;
while (isspace(*pos)) {
--pos;
if (pos < buffer)
return;
}
*pos = '\n';
}
}
编辑:我正在使用另一个函数的参数调用此函数。它看起来像这样:
dia_yesno("Hello, world! How are you doing today? I'm doing well");
声明为bool dia_yesno(char* guilabel)
。然后,在dia_yesno()
内,我按上述方式致电guilabel_wrap(guilabel, 15)
。
答案 0 :(得分:4)
您的字符串常量可能位于内存的只读区域,这就是您获得分段错误的原因。这可以通过尝试运行以下代码来证明:
$ cat foo.c
#include <stdio.h>
int main(void)
{
char* str = "foo";
str[0] = 'b';
printf("%s\n", str);
return 0;
}
$ gcc -o foo foo.c
$ ./foo
Bus error: 10
你应该创建一个足够大的缓冲区来保存你的字符串,加上额外的'\n'
字符,然后将你的字符串复制到第一个字符串中。将字符串声明为数组也可以解决问题,例如:
$ cat foo.c
#include <stdio.h>
int main(void)
{
char str[16] = "foo";
str[0] = 'b';
printf("%s\n", str);
return 0;
}
$ gcc -o foo foo.c
$ ./foo
boo
答案 1 :(得分:2)
你的字符串应该是这样的:
char guilabel[64] = "my string here";
你应该使用printf格式编写字符串:
printf("%s\n", guilabel);
答案 2 :(得分:0)
该字符串将位于可执行文件的数据段中,并且是只读的。您需要制作副本 - 使用strdup
。
真的guilabel
应该声明为const char *const guilabel
,代表它的真实类型。