用于双字符串比较的C case语句
我觉得必须有一个更好的方法来做到这一点,而不是我尝试了很长的路。我有两个令牌(令牌3和令牌4),它们可以是字符串R1到R6。我也有相同名称的int变量,R1到R6。我基本上希望案件陈述是用于双字符串比较的C case语句,c,if-statement,strcmp,C,If Statement,Strcmp,我觉得必须有一个更好的方法来做到这一点,而不是我尝试了很长的路。我有两个令牌(令牌3和令牌4),它们可以是字符串R1到R6。我也有相同名称的int变量,R1到R6。我基本上希望案件陈述是 (名称token3的变量)+=(名称token4的变量) 我实现这一点的方式似乎很荒谬,而且过于重复,但我不知道另一种方式。必须有一些方法来简化这件事,对吗 // ADD COMMAND else if (!strcmp(token2_instr, "ADD")) {
(名称token3的变量)+=(名称token4的变量)代码>
我实现这一点的方式似乎很荒谬,而且过于重复,但我不知道另一种方式。必须有一些方法来简化这件事,对吗
// ADD COMMAND
else if (!strcmp(token2_instr, "ADD")) {
printf("%s\n", token2_instr);
token3_arg1 = strtok_r(NULL, ", ", &line_save);
token4_arg2 = strtok_r(NULL, " \n", &line_save);
int num = atoi(token4_arg2);
// ADD Reg, Reg
if (num == 0) {
if (!strcmp(token3_arg1, "R1")) {
if (!strcmp(token4_arg2, "R1"))
R1 += R1;
else if(!strcmp(token4_arg2, "R2"))
R1 += R2;
else if(!strcmp(token4_arg2, "R3"))
R1 += R3;
else if(!strcmp(token4_arg2, "R4"))
R1 += R4;
else if(!strcmp(token4_arg2, "R5"))
R1 += R5;
else if(!strcmp(token4_arg2, "R6"))
R1 += R6;
}
else if(!strcmp(token3_arg1, "R2")) {
if (!strcmp(token4_arg2, "R1"))
R2 += R1;
else if(!strcmp(token4_arg2, "R2"))
R2 += R2;
else if(!strcmp(token4_arg2, "R3"))
R2 += R3;
else if(!strcmp(token4_arg2, "R4"))
R2 += R4;
else if(!strcmp(token4_arg2, "R5"))
R2 += R5;
else if(!strcmp(token4_arg2, "R6"))
R2 += R6;
}
else if(!strcmp(token3_arg1, "R3")) {
if (!strcmp(token4_arg2, "R1"))
R3 += R1;
else if(!strcmp(token4_arg2, "R2"))
R3 += R2;
else if(!strcmp(token4_arg2, "R3"))
R3 += R3;
else if(!strcmp(token4_arg2, "R4"))
R3 += R4;
else if(!strcmp(token4_arg2, "R5"))
R3 += R5;
else if(!strcmp(token4_arg2, "R6"))
R3 += R6;
}
else if(!strcmp(token3_arg1, "R4")) {
if (!strcmp(token4_arg2, "R1"))
R4 += R1;
else if(!strcmp(token4_arg2, "R2"))
R4 += R2;
else if(!strcmp(token4_arg2, "R3"))
R4 += R3;
else if(!strcmp(token4_arg2, "R4"))
R4 += R4;
else if(!strcmp(token4_arg2, "R5"))
R4 += R5;
else if(!strcmp(token4_arg2, "R6"))
R4 += R6;
}
else if(!strcmp(token3_arg1, "R5")) {
if (!strcmp(token4_arg2, "R1"))
R5 += R1;
else if(!strcmp(token4_arg2, "R2"))
R5 += R2;
else if(!strcmp(token4_arg2, "R3"))
R5 += R3;
else if(!strcmp(token4_arg2, "R4"))
R5 += R4;
else if(!strcmp(token4_arg2, "R5"))
R5 += R5;
else if(!strcmp(token4_arg2, "R6"))
R5 += R6;
}
else if(!strcmp(token3_arg1, "R6")) {
if (!strcmp(token4_arg2, "R1"))
R6 += R1;
else if(!strcmp(token4_arg2, "R2"))
R6 += R2;
else if(!strcmp(token4_arg2, "R3"))
R6 += R3;
else if(!strcmp(token4_arg2, "R4"))
R6 += R4;
else if(!strcmp(token4_arg2, "R5"))
R6 += R5;
else if(!strcmp(token4_arg2, "R6"))
R6 += R6;
}
}
// ADD Reg, Immediate
else {
if (!strcmp(token3_arg1, "R1"))
R1 += num;
else if(!strcmp(token3_arg1, "R2"))
R2 += num;
else if(!strcmp(token3_arg1, "R3"))
R3 += num;
else if(!strcmp(token3_arg1, "R4"))
R4 += num;
else if(!strcmp(token3_arg1, "R5"))
R5 += num;
else if(!strcmp(token3_arg1, "R6"))
R6 += num;
}
}
这是一个丑陋的攻击,但至少它避免了重复和strcmp()链:
这是一个丑陋的攻击,但至少它避免了重复和strcmp()链:
通过引入正确的数据结构,可以优雅地解决这个问题。保罗·格里菲斯在评论中提到了这一点
首先,让我们建立一个数据结构:
const int numberOfVariables = 6;
int R[numberOfVariables];
for (int i=0; i<numberOfVariables; i++) {
R[i] = 0;
}
char* tokenNames[] = {"R1", "R2", "R3", "R4", "R5", "R6"};
Paul Griffiths通过将变量名中的数字转换为数字来查找索引。在这里,我更喜欢更灵活的方式-想象一下您有R33
具有两个索引,最后:
R[indexToken3] += R[indexToken4];
背后的诀窍是每个Rn
的计数器与其名称位于同一索引中
如果项目变得更大,我强烈建议编写一个查找索引的函数,甚至使用一个完成的库函数 通过引入正确的数据结构,可以优雅地解决这个问题。保罗·格里菲斯在评论中提到了这一点
首先,让我们建立一个数据结构:
const int numberOfVariables = 6;
int R[numberOfVariables];
for (int i=0; i<numberOfVariables; i++) {
R[i] = 0;
}
char* tokenNames[] = {"R1", "R2", "R3", "R4", "R5", "R6"};
Paul Griffiths通过将变量名中的数字转换为数字来查找索引。在这里,我更喜欢更灵活的方式-想象一下您有R33
具有两个索引,最后:
R[indexToken3] += R[indexToken4];
背后的诀窍是每个Rn
的计数器与其名称位于同一索引中
如果项目变得更大,我强烈建议编写一个查找索引的函数,甚至使用一个完成的库函数 没有案例
标签。你的意思是什么?这看起来好像你想要一个数组或其他数据结构,而不是六个命名变量。R1
到R6
是全局的吗?R[token3_arg1[1]-'0']+=R[token4_arg2[1]-'0']上的一些变体如果你做了明智的事情,把R1
,R2
等变成一个数组,code>将在一行中完成。更好的方法是在处理字符串之前将其转换为实际的符号标记。奥拉夫,如果你是选择结束主题的人,我想说的是case结构而不是case语句,但是,我想你完全知道我的意思,你只是太迂腐了。保罗,谢谢你的建议。我想这正是我应该做的。“C案例陈述”-直接从标题开始!无论如何,“案例”是一个误用的术语。我不是透视者。文本并不能使您的意图更清晰。没有大小写
标签。你的意思是什么?这看起来好像你想要一个数组或其他数据结构,而不是六个命名变量。R1
到R6
是全局的吗?R[token3_arg1[1]-'0']+=R[token4_arg2[1]-'0']上的一些变体如果你做了明智的事情,把R1
,R2
等变成一个数组,code>将在一行中完成。更好的方法是在处理字符串之前将其转换为实际的符号标记。奥拉夫,如果你是选择结束主题的人,我想说的是case结构而不是case语句,但是,我想你完全知道我的意思,你只是太迂腐了。保罗,谢谢你的建议。我想这正是我应该做的。“C案例陈述”-直接从标题开始!无论如何,“案例”是一个误用的术语。我不是透视者。这篇课文并没有让你的意图更清楚。