Обтекание строки в C указателем - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь создать функцию 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';
    }
}

edit: я вызываю эту функцию, используя аргумент другой функции.Это выглядит так:

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 ]

4 голосов
/ 01 марта 2012

Ваша строковая константа, вероятно, находится в области памяти, доступной только для чтения, поэтому вы получаете ошибку сегментации.Это можно продемонстрировать, попробовав запустить следующий код:

$ 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
2 голосов
/ 01 марта 2012

Ваша строка должна быть сделана так:

 char guilabel[64] = "my string here";

И вы должны написать строку, используя формат для printf:

printf("%s\n", guilabel);
0 голосов
/ 01 марта 2012

Строка будет в сегменте данных исполняемого файла и будет доступна только для чтения. Вам нужно будет сделать копию - используйте strdup.

Действительно guilabel должно быть объявлено как const char *const guilabel, что представляет его истинный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...