\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);
我正在尝试使用 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);