C \n不使用strtok替换

C \n不使用strtok替换,c,pointers,strtok,C,Pointers,Strtok,我试图使用C的strtok函数来处理字符*并将其打印在显示器上,由于某种原因,我不知道字符'\n'是否像我相信strtok那样被'\0'替换。代码如下: -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); -

我试图使用C的strtok函数来处理字符*并将其打印在显示器上,由于某种原因,我不知道字符'\n'是否像我相信strtok那样被'\0'替换。代码如下:

-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");
    }
}
应用代码时,可以在中看到结果(抱歉,我在文章中添加图像时遇到格式问题),可以看到\n没有被替换,因为它是图像中出现的奇怪字符,调试程序仍然显示该字符。有没有任何迹象表明问题出在哪里

谢谢你的帮助,
Javier

strtok
希望能够改变传递给它的字符串:它不为每个令牌分配新内存,而是将
\0
字符放入令牌边界处的字符串中,然后向该字符串返回一系列指针

但在这种情况下,字符串是不可变的:它是存储在程序中的常量,不能更改。因此,
strtok
尽了最大努力:它将索引返回到每个令牌的起始点的字符串中,但它不能插入
\0
来标记结束。您的设备无法按预期方式处理
\n
s,因此它会用该错误字符显示它们。(这大概就是您首先使用此代码的原因。)

关键是只传入可变字符串。要使用文本值定义可变字符串,您需要
char my_string[]=“…”而不是
char*my_string=“…”
。在后一种情况下,它只是给你一个指向某个常量内存的指针;在前一种情况下,它实际上会生成一个数组供您使用。或者,您可以使用
strlen
查找字符串的长度,
malloc
为其分配一些内存,然后
strcpy
将其覆盖

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

1

malloc(要写入的字符串大小)
-它分配
sizeof(char*)
字节,而不是字符串所需的字节数。您也不会将分配的块分配给任何对象

二,


sizeof
不适用于指针。使用
strlen()+1
。不能
strok
字符串文本。您似乎没有将
malloc
的返回值保存到任何地方。@AnttiHaapala公平地说,
sizeof
在数组上起作用……OP只是没有在这里创建数组(我猜他们想这样做)。调用
malloc(sizeof string_to_write)的想法是什么而不使用其结果?这是绝对正确的,但您可能想解释为什么您需要为
strtok
使用可变字符串。(可能提到
免费
,因为我猜OP是手动内存管理的新手。)非常感谢Draconis的回答,它成功了!事实上,对于显示字体芯片,\n不知何故被理解为显示的字符,而且我想在显示器中的定位方面使用它,这就是我想到使用strtok的原因。还有一个问题,你知道有没有关于指针和示例的有用链接?这是我真正需要处理的事情。@Javier,我恐怕不知道其中一个;几年前我在一些CS课上学习了指针。但是“我怎样才能更多地了解C语言中的指针”在这个网站上似乎是一个非常有效的问题!好的,谢谢你。我在大学里也学过指针,但从那以后已经过了一段时间了哈哈
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);