gpt4 book ai didi

字符数组和指针如何使用strtok和strcmp

转载 作者:行者123 更新时间:2023-11-30 16:03:53 26 4
gpt4 key购买 nike

我正在为我的操作系统类(class)编写一个 Linux shell。我已经删除了大部分内容,但我仍停留在简单的字符串比较上。我能想到的都有了strcmp 应该接受\0 终止的字符串并返回 0 表示相等,但这似乎不起作用,甚至单步遍历数组并检查每个字符也不起作用。我目前在 strcmp 中有 cmd[0] 我知道这是不对的,它需要以 null 结尾,但我尝试使用 strcpy 和 strcat\0 到另一个字符串。如果有人能指出我的错误,我将不胜感激。

//Matthew Spiers
//CSC306

#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
#include <unistd.h>
#include <stdlib.h>

using namespace std;

void ckCmd(char dir[]);
int main(){

pid_t pid;
char cdstr[4] = "cd";
char str[50];
char *cmd[3];
char *pstr;
char temp[50];
char dir[50] = "/bin/";
while(1){
pid = fork();
if(pid < 0){
fprintf(stdout, "Fork Failed");
}
else if(pid == 0){
fprintf(stdout, "\e[36m306.SH>\e[0m");
fgets(str, 50, stdin);
for(int i =0; i<50; i++){
if(str[i] == '\n'){
str[i] = '\0';
}
}
strcpy(temp, str); // Make a copy of original string
cmd[0] = strtok(str, " ");
for(int i =1; i<3; i++){
cmd[i] = strtok(NULL, " ");
}
strcat(dir, cmd[0]);

cout << cmd[0];

pstr = strtok(temp, " "); //pull out only first token
//Change Directory
if(!strcmp(pstr, "cd")){ //if first token is cd
//either branch to a routine just change directory
//ie branch and change directory
}
//ckCmd(temp);

execlp(dir, cmd[0], cmd[1], cmd[2], NULL);
_exit(0);
}
else{
wait(NULL);
}
}
}

void ckCmd(char str[]){
char *p;
p = strtok(str, " ");
if(p[0] == 'c'){
chdir("new");
}
}

enter code here

最佳答案

strtok 不是可重入/线程安全的!您应该使用 strtok 中的 RETURN 值:

p = strtok(str, " ");
if(p[0] == 'c'){

cmd[0] = strtok(str, " ");
...
if(!strcmp(cmd[0], "cd")){

如果p/cmd[0]为NULL,则会崩溃。

关于字符数组和指针如何使用strtok和strcmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3728122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com