配置正确分隔符时strtok仍无法按空格拆分字符串是什么原因
问题根因
你的代码问题出在输入读取环节,和strtok的拆分逻辑、分隔符设置均无关:
scanf("%255s", b)使用%s格式符读取字符串时,默认以所有空白符(空格、制表符、换行符等)作为读取终止标记。你输入cat program.c时,只有第一个空白符前的cat被写入数组b,后面的program.c根本没有被读入缓冲区,自然无法拆分出第二个令牌。
修复方案
将输入读取语句替换为fgets即可读取包含空格的整行输入:
char b[256]; int k = 0; char *args[4]; char *tokens; char delimiters[] = " \t\n"; printf("Please enter the command you want to use:\n"); // 替换原scanf为fgets,读取整行输入 fgets(b, sizeof(b), stdin); tokens = strtok(b, delimiters); // 加边界判断避免args数组越界,预留最后一位可存NULL while (tokens != NULL && k < 3) { args[k++] = tokens; printf("%s\n",tokens); tokens = strtok(NULL, delimiters); } args[k] = NULL; // 可选:如果args要作为exec类函数的参数,末尾补NULL是规范用法
注:
fgets会将输入末尾的换行符一并读入缓冲区,你的分隔符已经包含\n,不需要额外做换行符清除处理。
内容的提问来源于stack exchange,提问作者Raz0rmaddnes
相关产品推荐
相关产品推荐

