所以我最近开始学习c语言,没有编码或计算机科学的先验知识。写下这段代码,使用拼字游戏点找到一个单词的值,如下所示: 1:AEILNORSTU 2:DG 3:BCMP 4:FHVWY 5:K 8:JX 10:QZ。
# include <stdio.h>
# include <ctype.h>
# include <conio.h>
int main (void)
{
int n=0;
char ch;
clrscr();
printf("Enter the SCRABBLE word\n");
ch = getchar();
while(ch!='\n')
{
toupper(ch);
if(ch =='A'||'E'||'I'||'L'||'N'||'O'||'R'||'S'||'T'||'U')
n=n+1;
else if (ch =='D'||'G')
n=n+2;
else if (ch =='B'||'C'||'M'||'P')
n=n+3;
else if (ch =='F'||'H'||'V'||'W'||'Y')
n=n+4;
else if (ch =='K')
n=n+5;
else if (ch =='J'||'X')
n=n+8;
else if (ch =='Q'||'Z')
n=n+10;
ch = getchar();
}
printf("The value is %d",n);
return 0;
}
那么当我运行这段代码时会发生什么: 输入SCRABBLE字 例如:障碍 值为7 虽然它应该是9,因为b带有3个点,如上面的代码所示,a携带1,r个载波1,再次r 1个点,i携带1个点,最后两个字母表各自为1个点,因此3 + 1 + 1 + 1 + 1 + 1 + 1 = 9
答案 0 :(得分:1)
ch =='D'||'G'
之类的表达式等于(ch == 'D')||'G'
。
换句话说,您首先执行子表达式ch == 'D'
。然后你做一个逻辑或使用'G'
。结果将始终为真,因为'G'
非零,并且C中的所有非零都为真。
您需要ch == 'D' || ch == 'G'
来检查ch
是否等于'D'
或ch
是否等于'G'
。
这是非常基本的,每个good beginners book都会告诉你。
在您显示的代码的特定情况下,第一次检查始终是真的,因此,您不会检查任何其他情况。
答案 1 :(得分:-1)
您忘记获得toupper
的返回值。你也不检查它
(根据man 3 toupper
,函数将在失败时返回相同的char)
然后你的条件不好:
if (ch == 'Q' || 'Z')
与if (ch == 'Q' || ch == 'Z')
不同
如果右侧或左侧条件为真,则||
表示 ,而在第一种情况下,(ch == 'Q')
并非总是如此,但'Z'
始终为真。
这意味着你的第一个条件:
if(ch =='A'||'E'||'I'||'L'||'N'||'O'||'R'||'S'||'T'||'U')
始终为真
以下是您可以应用的小修正案,这可能有效
char tmp;
ch = getchar();
while(ch!='\n')
{
//Stocking in a tmp char to check return value
tmp = ch;
//Here
ch = toupper(ch);
if (ch == tmp)
{
//Error
break;
}
{...}
else if (ch =='Q'|| ch =='Z')
n += 10;
ch = getchar();
}
编辑:更正toupper()
的返回值;