\ n не заменяется с помощью strtok - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь использовать функцию strtok в C для обработки символа * и печати его на дисплее, и похоже, что по какой-то причине я не знаю, что символ '\ n' не заменяется на '\ 0 'как я считаю, strtok делает. Код выглядит следующим образом:

-Декларация char * и переход к функции, где он будет обрабатываться:

char *string_to_write = "Some text\nSome other text\nNewtext";
malloc(sizeof string_to_write);
screen_write(string_to_write,ALIGN_LEFT_TOP,I2C0);

-обработка символа * в функции:

void screen_write(char *string_to_write,short alignment,short I2C)
{
    char *stw;
    stw = string_to_write;
    char* text_to_send;
    text_to_send=strtok(stw,"\n");
    while(text_to_send != NULL)
    {
        write_text(text_to_send,I2C);
        text_to_send=strtok(NULL, "\n");
    }
}

При применении кода результат можно увидеть в imgur (извините, у меня проблемы с форматированием при добавлении изображения здесь, в посте), где видно, что \ n не заменил, поскольку это странный символ, появляющийся на изображении, и отладчик все еще показывал символ также. Любые намеки, где может быть проблема?

Спасибо за вашу помощь, Хавьер

Ответы [ 2 ]

1 голос
/ 24 марта 2019

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

Но в этом случае ваша строка является неизменной: это константа, хранящаяся в вашей программе, и ее нельзя изменить. Так что strtok делает все возможное: он возвращает индексы в строку для начальной точки каждого токена, но он не может вставить \0 s, чтобы отметить концы. Ваше устройство не может обрабатывать \n s так, как вы ожидаете, поэтому вместо этого оно отображает их с этим символом ошибки. (По-видимому, именно поэтому вы используете этот код в первую очередь.)

Ключ должен передавать только изменяемые строки. Чтобы определить изменяемую строку с литеральным значением, вам нужно char my_string[] = "..."; вместо char* my_string = "...". В последнем случае он просто дает вам указатель на некоторую постоянную память; в первом случае он фактически создает массив для использования. Кроме того, вы можете использовать strlen, чтобы узнать, какова длина строки, malloc немного памяти для нее, а затем strcpy закончить ее.

P.S. Меня беспокоит ваше malloc: вы не экономите память, которую она вам дает, и ничего с этим не делаете. Убедитесь, что вы знаете, что делаете, прежде чем работать с динамическим распределением памяти! С этим не дружит, и легко начать течь, даже не осознавая этого.

0 голосов
/ 24 марта 2019

1.

malloc(sizeof string_to_write); - он выделяет sizeof(char *) байтов не так много байтов, как ваша строка. Вы также не назначаете выделенный блок чему-либо

2

char *string_to_write = "Some text\nSome other text\nNewtext";
char *ptr;
ptr = malloc(strlen(string_to_write) + 1);
strcpy(ptr, string_to_write);
screen_write(ptr,ALIGN_LEFT_TOP,I2C0);
...