例如,我有这个字符串:SMUL 9 A B
?如何获得9(int类型)A(char)和B(char)。可能的字符串可能是SMUL 12 A C
,因此这意味着它们在字符串中的位置不是常量。
进一步说明:这是用户为我的矩阵计算器程序输入的字符串。输入SMUL“标量”“矩阵-1”“矩阵-2”意味着矩阵运算是标量乘法,其中“标量”作为要乘以矩阵的数字,“矩阵-1”是要乘以的矩阵标量和“矩阵-2”是显示结果的矩阵。希望你能帮助我。我的项目现在将在2天后到期。
答案 0 :(得分: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;
}
答案 1 :(得分: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函数)或其他任何内容。
答案 2 :(得分: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;
}