2010-08-23 43 views
1

例如,我有這個字符串:SMUL 9 A B?我怎樣才能得到9(int型)A(char)和B(char)。可能的字符串可能是SMUL 12 A C,所以這意味着它們在字符串中的位置不是恆定的。如何將字符串拆分爲不同的類型(數字值爲int,字母爲char)?

進一步說明:這是一個用戶輸入的字符串,用於我的矩陣計算器程序。輸入SMUL「標量」「矩陣-1」「矩陣-2」意味着矩陣運算是以「標量」作爲要乘以矩陣的數量的標量乘法,「矩陣-1」是要乘以的矩陣標量,「矩陣-2」是顯示結果的矩陣。希望你能幫助我。我的項目現在將在2天后到期。

回答

0

您可以使用諸如strtok之類的函數來標記字符串。

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    char str[] ="SMUL 9 A B"; 
    char * pch; 
    char * operation; 
    int number; 
    pch = strtok (str," "); 
    while (pch != NULL) 
    { 
    if (is_operation(pch)) { 
     operation = strdup(pch); 
    } 
    else if (is_number(pch)) { 
     number = atoi(pch); 
    } 
    else { 
     add_operand(pch); 
    } 
    pch = strtok (NULL, " "); 
    } 

    /* your processing */ 

    return 0; 
} 

當然,在你的情況下,你需要識別字符串是一個運算符,一個數字還是一個矩陣標識符。因此,在每次迭代中,您都可以測試字符串是否是已知操作(例如使用strcmp),數字(使用isnum等ctype函數)或其他任何操作。

1

strtok不可折返,並轉換爲空標記。 sscanf可以工作,並可以爲您檢測數字或字符串列。

#include <stdio.h> 

typedef struct { 
char op[20]; 
union {int arg1num;char arg1str[20];} arg1; 
char arg2[20],arg3[20]; 
} Value; 

main() 
{ 
    Value v; 
    char withNumber[]="SMUL 9 A B "; 
    char withoutNumber[]="SMUL \"scalar\" \"matrix-1\" \"matrix-2\" "; 

    if(4==sscanf(withNumber,"%[^ ]%d %[^ ] %[^ ]",v.op,&v.arg1.arg1num,v.arg2,v.arg3)) 
    printf("wN:%s %d %s %s\n",v.op,v.arg1.arg1num,v.arg2,v.arg3); 
    if(4==sscanf(withoutNumber,"%[^ ] %[^ 0-9] %[^ ] %[^ ]",v.op,v.arg1.arg1str,v.arg2,v.arg3)) 
    printf("woN:%s %s %s %s\n",v.op,v.arg1.arg1str,v.arg2,v.arg3); 
    if(4==sscanf(withoutNumber,"%[^ ]%d %[^ ] %[^ ]",v.op,&v.arg1.arg1num,v.arg2,v.arg3)) 
    printf("wN:%s %d %s %s\n",v.op,v.arg1.arg1num,v.arg2,v.arg3); 
    if(4==sscanf(withNumber,"%[^ ] %[^ 0-9] %[^ ] %[^ ]",v.op,v.arg1.arg1str,v.arg2,v.arg3)) 
    printf("woN:%s %s %s %s\n",v.op,v.arg1.arg1str,v.arg2,v.arg3); 
    return 0; 
} 
+0

如果您想限制讀取的數量(例如,20個字符將溢出這些數組),sscanf還允許字符串的寬度說明符('%19 [^]')。 – 2010-08-23 13:41:32

0

聽起來像你想sscanf

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    char buffer[1024]; 
    char matrix1; 
    char matrix2; 
    int scalar; 

    /* read a line of input */ 
    fgets(buffer, sizeof(buffer), stdin); 

    /* determine the operation */ 
    if (strncmp(buffer, "SMUL ", 5) == 0) 
    { 
    if (sscanf(buffer, "%*s %d %c %c", &scalar, &matrix1, &matrix2) != 3) 
    { 
     printf("Unexpected Input: %s\n", buffer); 

     /* handle error */ 
     return EXIT_FAILURE; 
    } 

    /* perform multiplication */ 
    printf("Using scalar %d on matrices %c and %c.\n", 
     scalar, matrix1, matrix2); 
    } 

    return EXIT_SUCCESS; 
} 
+0

strncasecmp不是C89或C99,只有POSIX。 – user411313 2010-08-23 13:33:12

+0

@gordongekko,謝謝,我調整了我的解決方案。另外,剛剛看到你也推薦sscanf,不是故意複製你! – 2010-08-23 13:35:17