实现带管道的简易Shell:管道符号统计失败的问题排查
解决Shell管道统计中无法识别"|"符号的问题
核心错误原因
C语言中不能用==直接比较字符串内容,==比较的是两个字符串指针的内存地址,而非字符串本身的内容。你写的args[i]== "\0|\0"和args[i]=="|",本质是在对比args[i](解析后的token地址)与常量区字面量字符串的地址,两者地址不同,导致条件永远不成立,num_pipes自然无法递增。
正确的判断方式
使用C标准库的strcmp()函数比较字符串内容:
strcmp(a, b)返回0时,表示两个字符串完全相等- 你的
parse_args()已经将管道符作为独立token存入args数组,每个管道符token就是单独的字符串"|"(自动以\0结尾),无需考虑"\0|\0"这种形式
修改后的代码片段
// 记得在代码开头包含string.h头文件,否则strcmp会报错 #include <string.h> #ifdef step1 /*Detect pipe symbol in args*/ printf("Printing the args returned from parse_args:\n"); for(int i = 0; i < ARR_SIZE && args[i]!= NULL; i++){ printf("args[%d]: %s\n",i, args[i]); // 用strcmp判断是否为管道符 if(strcmp(args[i], "|") == 0){ num_pipes++; } } printf("There are %d pipes in the buffer.\n",num_pipes); #endif
内容的提问来源于stack exchange,提问作者oofmeister
相关产品推荐
相关产品推荐

