我在使用中C.我试图用read
来读取stdin
一些输入,然后使用strtok的一个数组装载值系统调用了一些麻烦,但我似乎无法做到这一点正确的(我不断获取段错误)。
这里是我开始的代码:
void read_input()
{
char* c;
read(0, c, 128);
printf("%s", c);
}
所以,这个工作得很好,我可以打印输出。不过,我已经试过几件事情接下来,他们都没有奏效。我努力了:
char arr[128]
,然后使用strcpy
,strncpy
和memcpy
的不同变化来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'
,然后在“约翰”将类似于“喜”。是不是我需要的第一个字符做,类似于上?
你可以直接去这样的:
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);
因为你把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
指针没有初始化,它指向无处。该程序可能会出现在这种情况下正常工作,但是这就是所谓的“不确定的行为”,谷歌认为和记住的是“不确定的行为”包括“显然是工作的罚款”。