\n 未使用 strtok 替换

\n is not substituted using strtok

我正在尝试使用 C 的 strtok 函数来处理 char* 并将其打印在显示器上,由于某种原因看起来像这样我不知道字符 '\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);

-函数中对char*的处理:

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中看到(抱歉,我在post中添加图像的格式有问题),在那里可以看到\n 没有被替换,因为它是图像中出现的奇怪字符,调试器仍然显示该字符。关于问题出在哪里的任何提示?

感谢您的帮助, 哈维尔

strtok 期望能够改变您传递给它的字符串:它不是为每个标记分配新内存,而是将 [=11=] 个字符放入标记边界处的字符串中,然后 returns 指向该字符串的一系列指针。

但在这种情况下,您的字符串是不可变的:它是存储在您的程序中的常量,无法更改。所以 strtok 正在尽力而为:它将索引返回到每个标记起点的字符串中,但它无法插入 [=11=] 来标记结尾。您的设备无法按照您期望的方式处理 \n,因此它会使用该错误字符显示它们。 (这大概就是您首先使用此代码的原因。)

关键是只传入可变字符串。要定义具有文字值的可变字符串,您需要 char my_string[] = "..."; 而不是 char* my_string = "..."。在后一种情况下,它只是给你一个指向某个常量内存的指针;在前一种情况下,它实际上制作了一个数组供您使用。或者,您可以使用 strlen 找出字符串的长度,malloc 一些内存,然后 strcpy 结束。

P.S。我担心你的 malloc:你没有保存它给你的任何地方的记忆,你也没有用它做任何事情。在使用动态内存分配之前,请确保您知道自己在做什么! C对此并不友好,很容易在不知不觉中开始泄漏。

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);