2012-04-15 130 views
0

我想通過空格手動解析字符串,而不使用strtok()或string.h中的任何內容。這看起來是否正確?當我嘗試這個時,我一直跳過字符串的末尾。手動解析字符串

char cmd[1024]; 
    int ret = read(STDIN, cmd, 1023); 
    cmd[ret-1] = '\0'; 

    char * args[128]; 
    int length = 0; 
    char * startptr = cmd; 
    char * endptr = cmd; 

    while(1){ 
     if(*startptr == '\n' || *startptr == '\0'){ 
      break; 
     } 
     if(*startptr == ' '){ 
      startptr ++; 
      endptr ++; 
      continue; 
     } 
     // startptr is placed 
     if(*endptr != '\0' || *endptr != '\n' || *endptr != ' '){ 
      endptr ++; 
      continue; 
     } 
     // both pointers placed 
     char * i = startptr; 
     for(i = startptr; i != endptr; i++){ 
      args[length][i-startptr] = *i; 
     } 
     length ++; 
     startptr = endptr; 
     if(*endptr == '\0' || *endptr == '\n'){ 
      break; 
     } 

    } 
+1

你是否嘗試過使用調試器進行調試? – 2012-04-15 21:32:34

回答

2

不是不對。邏輯表達式必須是'和'而不是'或'。
檢查限制會很好,有時候可能會產生有趣的效果,如'將ARG_MAX_LEN更改爲2',您將得到每個單詞的第一個字符。 可能這個代碼會起作用。

char cmd[1024]; 
int ret = readf(cmd, 1, 1023, stdin); 

char args[128][ARG_MAX_LEN]; //two dimensional array 
int length = 0; 
char * startptr = cmd; 
char * endptr = cmd; 
char *ap, *aep; 
if(ret > 0) 
    cmd[ret-1] = '\0'; 
else 
    cmd[0] = '\0'; 
while(*startptr != '\n' && *startptr != '\0') 
{ 
    if(*startptr == ' '){ 
     endptr = ++startptr ; 
     continue; 
    } 
    // startptr is placed 
    if(*endptr != '\0' && *endptr != '\n' && *endptr != ' '){ 
     endptr ++; 
     continue; 
    } 
    // both pointers placed 
    ap = &args[length][0]; 
    aep = ap + ARG_MAX_LEN - 1; 
    while(startptr != endptr && ap != &args[length+1]) 
     *ap++ = *startptr++; 
    if(length >= 128) 
     break; 
    length ++; 
    startptr = endptr; 
} 

如果你想獲得命令行參數,你也應該尋找字符轉義。

+0

謝謝!我認爲這是對我來說最大的長處。 – theeggman85 2012-04-16 01:03:11

1
if(*endptr != '\0' || *endptr != '\n' || *endptr != ' '){ 

你應該使用& &這裏:

if(*endptr != '\0' && *endptr != '\n' && *endptr != ' '){ 

你還沒有分配ARGS [長度],所以你可能會得到一個segfault,當您嘗試寫有。您需要首先使用malloc分配空間,或者使用2d數組。

您也有一個錯誤在這裏關閉:

cmd[ret-1] = '\0'; 

-1將使其覆蓋的最後一個字符在緩衝區中,或者更糟,如果該文件是空將會寫入cmd[-1]

0

你的做法是不正確的,但都沒有(在我看來)是你接受的答案(對不起user1333967)。

除了已經指出的邏輯錯誤,你有嵌套循環。它們幾乎總是表示認真思考的代碼,應該避免(有些情況下它們是明智的,但這不是一個)。

功能是你的朋友,尤其是字符串處理。如果你不想使用標準庫的strtok,strcpy,strchr等(出於一些奇怪的原因 - 也許是家庭作業?)編寫你自己的。他們很容易編寫,會簡化你的代碼,並使其易讀。忽略任何抱怨函數調用開銷的人; 99%的時間不重要。