用指针包装C中的字符串

时间:2012-03-01 00:59:49

标签: c string pointers

我正在尝试创建一个函数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)

3 个答案:

答案 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,代表它的真实类型。