2013-10-10 99 views
1

所以我有一個程序,我需要從用戶使用scanf函數的初始命令,問題是它可能只是一個字符串命令,一個字符串命令和一個字符串參數,一個字符串命令和一個int參數或一個字符串命令和兩個int參數有條件地執行scanf函數?

,所以我需要以某種方式創建一個scanf函數,它能夠處理所有的這些,因爲我不知道哪一個會被挑我來發第一

所以代碼處理所有的邊緣情況是

scanf("%s", c); 
scanf("%s%s", c, s; 
scanf("%s%d", c, &i); 
scanf("%s%d%d", c, &i, &i2); 

和可能的例子命令可能由最終用戶

print 
insert Hello 
del 4 
pick 2 5 

打字,但是這不會工作

那麼,有沒有一種方法,使執行有條件一個scanf函數?

回答

2

你只能讀取的第一個字,然後確定下一步要讀什麼:

char command[32]; 
scanf("%s", command); 
if(strncmp(command, "print", 32) == 0) { 
    ... 
} 
else if(strncmp(command, "insert", 32) == 0) { 
    char string[32]; 
    scanf("%s", string); 
    ... 
} 
else if(strncmp(command, "del", 32) == 0) { 
    int i; 
    scanf("%d", &i); 
    ... 
} 
else if(strncmp(command, "pick", 32) == 0) { 
    int i, j; 
    scanf("%d %d", &i, &j); 
    ... 
} 
1

閱讀全行,然後使用sscanf解析它。

一些不好的代碼如下:

scanf("%s", buf); 
if (strcmp(buf, "print") == 0) { 
    call_print(); 
} else if (strncmp(buf, "insert ", 7) == 0) { 
    call_insert(buf + 7); // pointer magic! 
} else if (strncmp(buf, "del ", 4) == 0) { 
    int i; 
    sscanf(buf + 4, "%d", &i); // feel free to use atoi or something 
    call_del(i); 
} else if (strncmp(buf, "pick ", 5) == 0) { 
    int i, i2; 
    sscanf(buf + 5, "%d%d", &i, &i2); 
    call_pick(i, i2); 
} else { 
    printf("Does not compute!\n"); 
} 
3

閱讀整條生產線,最好是具有安全功能像fgets,然後解析結果字符串以確定用戶是否寫入了有效的命令。然後可以使用if語句來實現條件執行。

2

因爲函數scanf系列返回成功解析的字段的數量,用得到,然後利用獲取完整的字符串sscanf的之前放置的時間越長模式:

char buffer[,..], cmd[...]; 
int num1, num2; 

gets(buffer); 
if (sscanf(buffer, "%[^ ] %d %d", cmd, &num1, &num2) == 3) { 
... 
} 
else if (sscanf(buffer, "%[^ ] %d", cmd, &num1) == 2) { 
... 
} else { 
... 
} 

模式%[^ ]得到一個字符串排除第一個空。 此外,通過空格分隔模式,scanf跳過任意之間的空格...