c - strtok 是如何工作的?
问题描述
#include <stdio.h>
#include<string.h>
int main() {
char a[]="hey -* there -* minecraft-; jukebox! ";
char *p=strtok(a,"-");
//printf("%s",a); --line-id(00)
while(p!= NULL)
{
printf("%s",p); //line-id(01)
p=strtok(NULL,"-");
}
printf("\n");
p=strtok(a,"*");
while(p!=NULL)
{
printf("%s",p);
p=strtok(NULL,"*");
}
return 0;
}
输出:
hey * there * Minecraft; jukebox!
hey
但我需要的输出是:
hey * there * Minecraft; jukebox!
hey there Minecraft jukebox!
Q) 为什么我不能将 line-id(01) 更改为, print("%s",*p)
因为 p 是一个指针,我们应该使用 *p 来获取值,p 指向右边..?我遇到了分段错误。
Q)如果我使用 print("%s",a) 我得到 hey 作为 line-id(00) 中的输出;为什么?
Q) 如果可能,请解释 strtok() 中使用的指针 p。strtok 是如何工作的?
解决方案
strtok()
修改输入字符串。首先复制它。strdup()
是你的朋友。
如果您的编译器抱怨它找不到strdup()
复制/粘贴它。
char *strdup(const char *s)
{
size_t len = strlen(s) + 1;
char *t = malloc(len);
if (!t) return NULL;
memcpy(t, s, len);
return t;
}
推荐阅读
- sql - SQL - 遍历具有相同架构的本地表列表
- haskell - Haskell 中的类型 `Fix` 和函数 `fix` 是如何相同的?
- c++ - C++ 如何使用子类制作 unordered_map
- javascript - 计算(长度*数量=总(米),总(米)*价格=总价)但总价不会显示结果
- selenium - 运行 selenium 时出错,chrome 位置和 chrome 驱动程序问题
- ruby-on-rails - Ruby on Rails - 开发和生产的文件路径不同?
- c# - 基于两列聚合两个相同的列表并对第三列求和
- amazon-cognito - Cognito 创建导入作业 - 权限不足
- maven - maven并行测试和编译
- kubernetes - Airflow 何时使用 KubernetesExecutor 与 KubernetesPodOperator?