2015-04-02 2 views
0

Так что в основном я пишу программу, которая многократно считывает строки ввода со стандартного ввода, разделяет их в массиве char **. Для каждой строки обрабатывайте первый элемент как полный путь к исполняемой программе. Выполните программу, передав остальную часть элементов в строке в качестве аргументов. Если строка пуста, ничего не делайте и переходите к следующей строке. Повторяйте, пока первый элемент не будет содержать строку «exit».функции fork() и exec() в C

Мои проблемы:

  1. когда вход "выход", то зЬгстр (л [0], "выход") возвращает 10 вместо 0. Почему?
  2. Программа была скомпилирована, но работает только для нечетного числа аргументов. Например, если я вводил «/ bin/echo This is good», он печатает «Это хорошо» Но если я ввожу «/ bin/echo Это очень хорошо», он печатает «error».

Вот мой код:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define BUFSIZE 10000 
int space; 
char** createArray(char *line) { 
    int len_line = strlen(line); 
    char **wordArray = NULL;  
    if(len_line > 1){  
     char *token = strtok(line, " ");  
     space = 0; 
     while (token) { 
      wordArray = realloc(wordArray, sizeof(char*)*++space); 
      wordArray[space-1] = token; 
      token = strtok(NULL, " "); 
     } 
    } 
    return wordArray; 
} 


int main(int argc, const char* argv[]) {  
    char line[BUFSIZE]; 
    while (1) { 
     printf("%s\n", ">"); 
     fgets(line, BUFSIZE, stdin); 
     char** l = createArray(line); 

     if (l) { 
      /*why instaed of zero, when l[0] 
      /*equals quit, strcmp() returns 10?*/ 
      printf("%d\n", strcmp(l[0], "exit"));  
      if(strcmp(l[0], "exit")==10) { 
       exit(0); 
      } 
      else if(fork() == 0) { 
       execv(l[0], l); 
       printf("%s\n", "Error!"); 
      } 
     } 
    } 
    return 1; 
} 
+0

'if (strcmp (l [0]," exit ") == 10)' ... или вы имели в виду 'if (strcmp (l [0]," exit ") == 0)'? –

+1

Ожидание 'strcmp()' для возврата ровно 10 довольно странно. Он возвращает либо ноль, либо положительное число (возможно, 10), либо отрицательное число. – sharptooth

+0

Вы действительно должны скомпилировать все предупреждения и информацию об отладке (например, 'gcc -Wall -Wextra -g'), тогда ** использовать отладчик ** (' gdb') –

ответ

0

Подойдя к первому вопросу, что вы столкнулись с

1. when I input "exit", the strcmp(l[0], "exit") returns 10 instead of 0. Why? 

При вводе «выход» и нажмите клавишу Enter, строка читается fgets является «выход \ п». Сравнивая «выход» с «выхода \ п» дает 10. Либо вы удалите «\ п» с конца перед сравнением или изменить метод сравнения с

if(strcmp(l[0], "exit\n") == 0) 

См исправленный код ниже

int main(int argc, const char* argv[]) { 
    char line[BUFSIZE]; 
    while (1) { 
     printf("%s\n", ">"); 
     fgets(line, BUFSIZE, stdin); 
     int len = strlen(line); 
     line[len - 1] = 0; 
     char** l = createArray(line); 

     if (l) { 
      /*why instaed of zero, when l[0] 
      equals quit, strcmp() returns 10?*/ 
      printf("%d\n", strcmp(l[0], "exit")); 
      if(strcmp(l[0], "exit")==0) { 
       exit(0); 
      } 
      else if(fork() == 0) { 
       execv(l[0], l); 
       printf("%s\n", "Error!"); 
      } 
     } 
    } 
    return 1; 
} 

по второму вопросу

2. The program got compiled but only works for odd number of arguments. For example, if I input "/bin/echo This is good", it prints "This is good" But if I input "/bin/echo This is very good", it prints "error". 

Попробуйте с исправленным кодом, указанным ниже. Оно работает. Эта проблема больше не существует.

+1

Сравнение с опцией '" exit \ n "' является ** no **, потому что его оболочка все равно не работает. Он ** должен ** удалить новую строку. – Downvoter

1

Вы забыли, что fgets() также возвращает символ новой строки, не так ли?

После прочтения с fgets(), устранить его с этой линии:

line[strlen(line) - 1] = '\0'; 

Попробуй еще раз, пожалуйста!

+0

[удаление конечного символа новой строки из fgets] (http: // stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input) – user3386109

Смежные вопросы