2012-09-18 68 views
1
 int bytes_read; 
     int rv; 
     int nchars = 200; /*max possible number for the input of the user*/ 
     size_t nbytes = nchars; /*size of chars in bytes*/ 
     char *commands[2]; 
     char *line = malloc(nbytes + 1); 
     bytes_read = getline(&line, &nbytes, stdin); /*read line from stdin*/ 
     if (bytes_read == -1) { 
      printf("Read line error"); 
      exit(-1); 
     } else { 
      if (line[strlen(line-1)] == '\n') { 
       line[strlen(line-1)] = '\0'; /*change new line character in the end of the line of stdin*/ 
      } 
     } 
     if (strcmp(line,"exit") == 0) { 
      rv = 3; 
      exit(rv); 
     } 
     commands[0] = line; 
     commands[1] = NULL; 
     execvp(commands[0], commands); 
     perror("Execution error"); 
     exit(-1); 

我在上面的代碼中有問題。如果我使用getline甚至fgets從終端獲取用戶的輸入,並鍵入"ls"例如,execvp打印出「沒有這樣的文件或目錄」。但如果我把commands[0]="ls"它正確運行。可能是什麼原因?Char陣列和C中的getline

+5

在開始時,'line [strlen(line-1)]'應該是'line [strlen(line)-1]'...另外,請格式化您的代碼當問關於SO的問題時。 –

+0

什麼是getline?你沒有使用C++,因爲這些將是錯誤的論點......請發佈它的源代碼。 – nneonneo

+0

謝謝@ conrad-meyer!並感謝關於代碼的提示。 –

回答

3
if (line[strlen(line-1)] == '\n') { 
    line[strlen(line-1)] = '\0'; /*change new line character in the end of the line of stdin*/ 

刪除'\ n'的邏輯看起來不正確。我認爲它應該是:

if (line [ strlen(line) - 1 ] == '\n') 
    line [ strlen(line) - 1 ] = '\0'; /*change new line character in the end of the line of stdin*/