转换缓冲器到char为strtok的阵列

问题描述 投票:1回答:2

我在使用中C.我试图用read来读取stdin一些输入,然后使用strtok的一个数组装载值系统调用了一些麻烦,但我似乎无法做到这一点正确的(我不断获取段错误)。

这里是我开始的代码:

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

所以,这个工作得很好,我可以打印输出。不过,我已经试过几件事情接下来,他们都没有奏效。我努力了:

  1. 创建阵列char arr[128],然后使用strcpystrncpymemcpy的不同变化来c复制到arr,但他们没有工作,我也得到一个segfault。

其实,这一切我都试过了。我不知道我应该如何c复制到arr这样我就可以使用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',然后在“约翰”将类似于“喜”。是不是我需要的第一个字符做,类似于上?

c arrays system-calls
2个回答
1
投票

你可以直接去这样的:

void read_input()
{
    char arr[128];
    read(0, arr, 128);
    printf("%s", arr);
}

或动态内存分配路线:

char *arr = malloc((sizeof(*arr) * 128) + 1);
if (arr == NULL)
{
    // handle error
}
int r = read(0, arr, 128);
arr[r] = '\0';
printf("%s", arr);

1
投票

因为你把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。当你不NUL之前把printf,后者显示所有字符,直到它遇到一个NUL因此你得到的输出:

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

此输出可以变化,这取决于arr缓冲器的先前的内容。

第一个版本是错误的,因为c指针没有初始化,它指向无处。该程序可能会出现在这种情况下正常工作,但是这就是所谓的“不确定的行为”,谷歌认为和记住的是“不确定的行为”包括“显然是工作的罚款”。

© www.soinside.com 2019 - 2024. All rights reserved.