首页
学习
活动
专区
圈层
工具
发布

【安全函数】Windows 安全分割利器:strtok_s () 详解

返回值: 成功:返回当前子串(token)的首地址; 失败 / 分割结束:返回NULL(遍历完字符串或参数非法,如str为 NULL 且context无效)。...(如文本框中的 “姓名,年龄,性别”)可能存在非法长度或特殊字符,strtok_s()的参数校验和 C11 版的maxcount可防止缓冲区溢出。...首次调用前,context需初始化为NULL(或未赋值,但建议显式设为NULL); 分割不同字符串时,需使用独立的context(不可复用同一context,否则状态混乱); 错误示例(复用 context...: char input[64]; // 错误:用gets()读取输入,可能溢出 // gets(input); // 正确:用fgets_s()安全读取 fgets_s(input, sizeof(input...返回 NULL) 边界控制 无(可能越界) C11 版支持 maxcount 防溢出 错误处理 无明确错误码(返回 NULL) 返回 NULL + 参数校验(减少崩溃) 多字符串并行分割 不支持(静态变量冲突

7910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux之模拟shell命令行解释器

    = NULL); lineCommand[strlen(linCommand) - 1] = 0; 用fgets函数获取一行的内容,将内容存在字符数组lineCommand中。...因为fgets获取也会将enter作为'\n’获取,为了避免多打印一行,我们要将最后一个元素重置为'\0'。...获取 strtok(lineCommand," "); 用strtok函数将输入的字符串切割成若干个子串; strtok函数的参数:第一次传字符串的首地址,之后传NULL即可(会从上次切割的位置继续切割...因此,对于cd命令我们应该用内建命令:该命令不需要子进程执行,而是让bash自己执行。要修改程序的工作目录需要用chdir系统调用。 什么是当前路径? 当前路径就是cwd。...本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

    66420

    【Linux系统编程】(十八)手搓 Linux Shell 命令行解释器:从 0 到 1 打造属于你的终端神器

    ,最后通过wait/waitpid等待子进程执行完成(后台执行除外); 反馈(Feedback):将命令执行结果(正常输出或错误信息)打印到终端,然后回到循环开头,等待用户输入下一条命令。...终端 I/O 操作:使用fgets、printf等函数读取用户输入、打印输出,处理终端缓冲区、换行符等问题; 字符串处理:使用strtok、strcpy、strcmp、memmove等函数实现命令行的拆分...fgets的注意事项:fgets会读取用户输入的换行符\n并存储在缓冲区中,因此需要通过trim_cmd函数去除换行符,否则后续解析命令会出现问题。...这里我们使用strtok函数实现字符串拆分,strtok可以按照指定的分隔符(这里是空格、制表符)拆分字符串,返回拆分后的子字符串指针。...argv数组的格式要求:exec函数族要求参数数组argv必须以NULL结尾,这是因为exec函数需要通过NULL来判断参数列表的结束,否则会出现未知错误。

    17210

    写一个自己的命令行解释器

    所以我也可以创建一个数组存放我输入的指令(以空格为分割,将我要执行的程序和所带的选项分割开来),采用库函数strtok来切割。...i=1; while(myargv[i++]=strtok(NULL," "));//循环切割,先将切割后的结果赋值给myargv,再将这个值作为判断,strtok在结束时会返回空...,再将这个值作为判断,strtok在结束时会返回空 pid_t id=fork(); assert(id!...(NULL," "));//循环切割,先将切割后的结果赋值给myargv,再将这个值作为判断,strtok在结束时会返回空 if(myargv[0]!...,首先我的有提示符 printf("用户名@服务器 当前路径:"); fflush(stdout); //将用户输入的指令作为字符串存入数组中,用fgets函数获取输入的指令

    1.5K10

    从零开始手写Shell:详解命令行解释器的实现原理

    > 0; } 安全输入要点: 使用fgets替代gets:指定最大读取长度 处理换行符:将输入结尾的\n替换为\0 空命令过滤:直接回车不执行 命令解析器实现 void CommandParse(char...后续调用:使用nullptr继续处理原字符串 修改原理:通过插入\0修改原字符串,返回每个token的起始地址 示例解析过程: 输入:"ls -l /usr" 内存变化: l s \0 - l \0...) execvp(g_argv[0], g_argv); // 只有exec失败时会执行到这里 exit(1); // 非正常退出(错误码...输入处理流水线 GetCommandLine()实现三步处理: 安全读取(fgets防溢出) 去除换行(\n→\0) 空输入过滤 命令解析核心 CommandParse()使用strtok...:使用NULL继续处理原字符串 修改原理:通过插入\0分割字符串,返回每个token的起始地址 execvp特性 v:参数以数组形式传递(需NULL结尾) p:自动搜索PATH环境变量中的可执行文件

    68210

    【Linux】模拟实现一个shell

    这个函数也不需要传参,因为所有需要得到的都已经存在于环境变量中了。所以为了能够打印相关的信息,就要去读取。所以我们就需要去编写相关函数去编写读取的方法。 首先第一步是构建一个框架。...我的建议是选择一个char *fgets(char *s,int size,FILE *stream),如果能够 正确返回,那么返回s的起始位置的地址。如果返回错误,就返回NULL。...分割之后,strtok会返回NULL,刚好让gArgv最后一个元素是NULL, 并且while判断结束 } 这里定义的SEP我们需要找到的目标的位置是空格,但是这里非常容易错,那是因为strtok函数中的第二个参数是字符串而不是字符...函数的返回值设置为int类型,这样做的话能够判断是否用户输入的为内建命令,如果是内建命令的话,就会执行完,也就不会再去执行下一个的ExecuteCommand函数。避免了重复执行的错误。...,不能说我们进行了好几次的cd或者其他命令之后环境变量因为没有进行更新从而错误。

    40510

    C语言常用字符串操作函数整理(详细全面)

    成功:成功读取的字符串   读到文件尾或出错: NULL 描述:   fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也做为字符串的一部分。...通过scanf和gets输入一个字符串的时候,不包含结尾的“\n”,但通过fgets结尾多了“\n”。fgets()函数是安全的,不存在缓冲区溢出的问题。...如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。...当strtok()在参数s的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。...正负号才开始做 转换,而遇到 非数字或 字符串结束符(’\0’)才 结束转换,并将结果返回 返回值。

    4.7K40

    【Linux】从零开始手搓 Shell (超详解)

    被调用的函数执行一定的操作,然后返回一个值。每个函数都有他的局部变量,不同的函数通过call/return系统进行通信。 这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。...(nullptr, sep))); // 形成上面图片的结构 } strtok 函数分析:char *strtok(char *str, const char *delim) 功能:函数返回字符串 str...ch; ch = strtok(nullptr, sep)) { gargv[gargc++] = ch; } } ❓为啥用while 需要 -- ,用 for 不需要呢...执行命令 } return 0; } 4.1 函数实现 对解析好的命令,开始执行,但是shell 不能自己去执行这个命令,因为如果我们输入错误的命令话,假如用户输入错误的命令或者有 Bug...返回值执行成功则返回0,失败返回-1,errno为错误代码。

    62910

    C语言字符串从入门到进阶指南

    目录 字符数组 和 字符串区别 字符数组  字符串  统计字符串每个字符出现的次数 字符串获取 scanf gets fgets puts fputs strlen 求非空字符串元素个数 判断字符串是否回文..."); return EXIT_SUCCESS; fgets  从stdin获取一个字符串, 预留 \0 的存储空间。...参2:描述空间的大小。  参3:读取字符串的位置。    键盘 --》 标准输入:std  返回值:返回实际获取到的字符串首地址。...如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况  strncpy 参数 dest:目的的字符串首地址 src:原字符首要地址 n:指定需要拷贝字符串个数 将 src 的内容...() 按照既定的分割符,来拆分字符串,按 ‘ . ’   “www.baidu.com”  使用方法strtok("www.baidu.com","k");  -->变成 char *strtok(

    83320

    字符串分割函数strtok()详解

    ,需用strtok_r()(可重入版)替代; 复杂格式分割:如 CSV 文件(含引号包裹的分隔符,如"a,b",c),strtok()无法处理,需自定义逻辑或使用专门的 CSV 解析库; 宽字符字符串(...五、注意事项:避坑指南 strtok()的特性决定了它有很多 “隐性坑”,稍有不慎就会导致程序崩溃或逻辑错误。...错误示例(const 字符串): // 错误:str是const类型,不可修改 const char str[] = "hello,world"; char *token = strtok(str, "...错误示例(首次传 NULL): // 错误:首次调用传入NULL,直接返回NULL char *token = strtok(NULL, ","); if (token == NULL) { printf...答: 两者在处理连续分隔符时的核心差异是是否保留空串: strtok():会自动跳过连续的分隔符,不返回空串。

    16410

    【Linux系统】自定义Shell命令行解释器

    路径操作错误 输入路径 \~/Documents 时: "\~/Documents\n" // 路径检测失败 系统调用(如 chdir())将返回错误,因为路径包含非法字符 \n。 3....delim:分隔符集合(如 "," 或 " \t\n"),任意字符均触发分割。 返回值: 成功:指向当前子串的指针。 失败:返回 NULL(无更多子串)。...继续扫描直到遇到 delim 中的字符或字符串结尾,将该位置替换为 \0,并返回子串指针。 后续调用: 传入 NULL 作为 str 参数,函数从上一次替换的 \0 之后继续扫描。...返回值与错误码 返回值 含义 错误码 触发条件 0 成功 - - -1 失败 EINVAL name 含 = 或为空 ENOMEM 内存不足,无法分配新环境空间 特殊场景: 在 z/OS 中...(可为 NULL) size:缓冲区大小(字节数) 返回值: 成功:返回 buf(若 buf 非 NULL)或新分配内存指针(若 buf 为 NULL) 失败:返回 NULL 并设置 errno 2

    17610

    基础知识 | 每日一练(113)

    而且, 它的 %s 格式有着和 gets() 一样的问题 —— 很难保证接收缓冲不溢出。 更一般地讲, scanf() 的设计使用于相对结构化的, 格式整齐的输入。...设计上,它的名称就是来自于 “scan formatted”。 如果你注意到, 它会告诉你成或失败,但它只能提供失败的大略位置, 至于失败的原因, 就无从得知了。...对 scanf() 多得体的错误恢复几乎是不可能的; 通常先用类似 fgets() 的函数读入整行, 然后再用scanf() 或其它技术解释。...strtol(), strtok() 和 atoi() 等函数通常有用。如果你真的要用任何 scanf 的变体, 你要确保检查返回值, 以确定找到了期待的值。...而使用 %s 格式的时候, 一定要小心缓冲区溢出。

    3953129

    UNIX高级环境编程 第三次实验 实现带参数的简单Shell

    当fork()函数返回值为0时表示处 于子进程中;而返回值大于0时表示处于父进程中,此时的返回值是子进程的进程id。因此,fork()的返回值可以用来划分仅仅适合父进程 和子进程执行的程序段。...fork()函数返回值为-1时表示出错。 如果子进程只是运行与父进程完全一样的程序,那用处是很有限的。要让子进程运行不同于父进程的程序,就必须调用execve函数,它是 所有其他exec函数的基础。...提示:argv数组中各指针所指向的字符串,可以直接利用buf的存储空间,不需要另外分配内存。 2....因此在token为或>时,设置相应的flag:0为正常参数,1代表输入重定向,2代表输出重定向。...execvp则不需要,它们两者的区别是execvp函数参数是一个argv参数表,而execlp是一项一项给出参数,这些函数族最终都是调用execve系统调用。

    1.2K20

    【Linux】进程控制(4)自主shell命令行解释器

    用来获取用户输入的字符串函数有很多,比如scanf,fgets,这里我们用fgets读取一整行,因为scanf遇到空格就不会读取了,这不符合我们的要求,我们要把空格一起读取到。...如果用户没有输入,那么fgets读取失败Getcommand函数的返回值就是0,会执行continue语句,不会执行接下来的代码,重新进入循环。...strtok(NULL, gsep))); 69 } while ((gargv[++gargc] = strtok(NULL, gsep)));代码逻辑是strtok先切割返回一个值,再把这个值存入...gargv[++gargc]里面,再检测这个值 代码还有一点,那就是strtok函数在没有可以切割的字符串了之后会返回NULL,这个NULL会存入gargv[++gargc]里面,gargc自增1,所以...这个函数的作用是更改当前所执行这个函数的进程的路径。会将当前进程的工作路径修改为传入的path。 成功则返回0,失败则返回-1。

    9010
    领券