首页 > 解决方案 > 将缓冲区转换为 strtok 的 char 数组

问题描述

我在 C 中使用系统调用时遇到了一些问题。我试图read从 读取一些输入stdin,然后使用 strtok 加载数组中的值,但我似乎做不到正确(我不断收到段错误) .

这是我开始的代码:

void read_input()
{
    char* c;
    read(0, c, 128);
    printf("%s", c);
}

所以,这很好用,我可以打印输出。但是,我接下来尝试了几件事,但都没有奏效。我努力了:

  1. 创建一个数组char arr[128],然后使用 、 和 的不同变体strcpy复制strncpymemcpycarr它们没有工作,我得到一个段错误。

实际上,这就是我所尝试的全部。我不确定我应该如何复制carr以便我可以使用strtok. 谁能解释一下?

谢谢

编辑:

好的,这是我的新代码:

void
read_input()
{
    char arr[129];
    int r = read(0, arr, 129);
    printf("%s", arr);

    arr[r] = '\0';

    char* pch;

    pch = strtok(arr, " \n");

    while(pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, " \n");
    }
}

我正在尝试从标准输入读取输入,例如“嗨,我的名字是约翰”。这是我从 printfs 得到的输出:

hi my name is john
�����hi
my
name
is
john

为什么第一个令牌看起来像这样?我注意到如果我不添加arr[r] = '\0',那么“john”会看起来类似于“hi”。我需要为第一个字符做些什么,类似于最后一个字符吗?

标签: carrayssystem-calls

解决方案


您的第二个程序不起作用,因为您将NUL终止符放在printf. 你需要先做 printf

char arr[129];              // 128 + 1 for the NUL terminator
int r = read(0, arr, 128);
arr[r] = '\0';
printf("%s\n", arr);        // \n for better readbility of the output

您还需要多一个字节作为NUL终止符,因此129.

printf使用%s格式说明符打印NUL终止的字符串。由于您没有放置NULbefore printf,因此后者显示所有字符,直到遇到 aNUL因此您得到的输出:

hi my name is john
�����
...

此输出可能会有所不同,这取决于arr缓冲区的先前内容。

第一个版本是错误的,因为c指针没有初始化,它没有指向任何地方。在这种情况下,该程序似乎可以正常工作,但这就是所谓的“未定义行为”,谷歌搜索并记住“未定义行为”包括“显然工作正常”。


推荐阅读