Массивы символов и указатели на использование strtok и strcmp - PullRequest
0 голосов
/ 16 сентября 2010

Я пишу оболочку linux для своего класса операционных систем.Я выбил большинство из них, но я застрял на простых сравнениях строк.У меня есть все, что я могу придумать.strcmp должен принять в \ 0 завершенные строки и вернуть 0 для равенства, но это, похоже, не работает и даже пошагово проходит по массиву и проверяет, что каждый символ также не работает.В настоящее время у меня есть cmd [0] в strcmp, я знаю, что это неправильно, его нужно завершить нулем, но я попытался использовать 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

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

strtok не является реентерабельным / поточно-ориентированным!Вам следует использовать RETURN-значение из strtok:

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

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

Если p / cmd [0] равно NULL, произойдет сбой.

0 голосов
/ 16 сентября 2010

Что именно не работает? Можете показать меньший пример кода?

Линия:

strcat(dir, cmd[0]);

Знаете ли вы, что целью является dir, а не cmd[0]?

Строка: !strcmp(cmd[0], "cd") сама по себе верна, но неясно, что именно вы пытаетесь сделать. Не могли бы вы прокомментировать каждую группу строк со своими намерениями?


Обновление: я предлагаю вам попробовать слишком много вещей одновременно. Чтобы разобраться в вашей проблеме, я рекомендую следующие шаги:

  1. Понять, как работает strtok. Это не очень сложно - прочтите руководство и попробуйте в отдельном файле с некоторыми строками. Это должно дать вам хорошую идею.
  2. Разбейте части вашего кода и предоставьте им предварительно заданный ввод (не от пользователя и без разветвления). Посмотрите, где поведение соответствует ожидаемому и где оно исчезает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...