c - 将缓冲区转换为 strtok 的 char 数组
问题描述
我在 C 中使用系统调用时遇到了一些问题。我试图read
从 读取一些输入stdin
,然后使用 strtok 加载数组中的值,但我似乎做不到正确(我不断收到段错误) .
这是我开始的代码:
void read_input()
{
char* c;
read(0, c, 128);
printf("%s", c);
}
所以,这很好用,我可以打印输出。但是,我接下来尝试了几件事,但都没有奏效。我努力了:
- 创建一个数组
char arr[128]
,然后使用 、 和 的不同变体strcpy
复制strncpy
到memcpy
,c
但arr
它们没有工作,我得到一个段错误。
实际上,这就是我所尝试的全部。我不确定我应该如何复制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'
,那么“john”会看起来类似于“hi”。我需要为第一个字符做些什么,类似于最后一个字符吗?
解决方案
您的第二个程序不起作用,因为您将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
before printf
,因此后者显示所有字符,直到遇到 aNUL
因此您得到的输出:
hi my name is john
�����
...
此输出可能会有所不同,这取决于arr
缓冲区的先前内容。
第一个版本是错误的,因为c
指针没有初始化,它没有指向任何地方。在这种情况下,该程序似乎可以正常工作,但这就是所谓的“未定义行为”,谷歌搜索并记住“未定义行为”包括“显然工作正常”。
推荐阅读
- sql - 在同一个表上查询时,HIVE 列别名未显示在输出中
- excel - VBA 代码将主 Outlook 收件箱中的所有未读电子邮件随机拆分到子文件夹中
- javascript - .map() 方法中的参数顺序
- powershell - 使用 Powershell 将 MSMQ 消息从一个队列移动到另一个队列
- java - 在 Java NullPointerException 中为 arrayList 添加每个列表元素
- excel - 基于相似的选项卡名称运行宏
- c# - 当关卡结束时,如何将一个关卡的分数添加到该关卡之外的货币?
- flutter - 如何从 url [Flutter][Dio] 获取文件名
- java - 将具有多列选择的@Query 映射到@Repository 中的Java 对象- 是否可以开箱即用?
- swiftui - 为什么 VStack 不能在带有滚动视图的 GeometryReader 中工作?