昨天我们参加了C语言课程考试,问题就是这样:
编写一个程序,从用户那里获取任意多个字符(直到他/她输入"!")然后以小写形式输出第一个和最后一个输入的大写字母。
一个。如果用户只输入一个大写字母,程序应以小写形式输出该大写字母两次。
湾我们可以假设用户总是输入至少一个大写字母。
lskdjfSFFKAFfkafafkKFAFkaKfgRORELKkjfks!
====> sk
Mdsfisjf98948*3jkfHf9059,353953,^+%^+%!
====> mh
sjfhsfR'^^''jfi2jpfj99ejfsdfs
====> rr
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
char toLower(char n){
char m=' ';
if(n>='A'&&n<='Z'){
m=n-'A'+'a';
return m;
}
else
return n;
}
int main(){
int i=0;
char ch,chmod,chFirst=' ',chLast=' ';
scanf("%c",&ch);
while(ch!='!'){
chmod=toLower(ch);
if(chmod!=ch){
chLast=chmod;
i++;
}
if(i==1)
chFirst=chmod;
scanf("%c",&ch);
}
if(i==1)
chFirst=chLast;
printf("%c%c",chFirst,chLast);
return 0;
}
我用三个不同的编译器尝试了这个代码,它输出了错误的结果。有一些奇怪的事情。它导致第一个字母错误但第二个字母正确。如果输入只包含一个大写字母,则输出再次正确。最后,我一遍又一遍地检查了这段代码。
此代码有什么问题?
答案 0 :(得分:1)
只有在第一次设置时才设置chFirst ==&#39; &#39;并在第一个if中执行。这样你就可以摆脱变量...
答案 1 :(得分:1)
有问题的逻辑在这里:
while(ch!='!'){
chmod=toLower(ch);
if(chmod!=ch){
chLast=chmod;
i++;
}
if(i==1)
chFirst=chmod;
scanf("%c",&ch);
}
如果第一个字母是大写,请考虑这种情况。然后,chLast
将被更改,i
递增,然后chFirst
将被更改。
现在,如果第二个字母不是大写,i
将不会递增,仍然是1
。因此,chFirst
将再次更改,这不是您想要的。
更好的逻辑如下:
while(ch!='!'){
chmod=toLower(ch);
if(chmod!=ch){
chLast=chmod;
if(i==0) {
chFirst=chmod;
i=1;
}
}
scanf("%c",&ch);
}
在这个改进的逻辑中,您实际上使用i
作为布尔变量,0
表示chFirst
未设置,1
表示chFirst
}已设置。请注意,您无需对if(i==1) chFirst=chLast;
进行最终检查。
答案 2 :(得分:0)
正如@ace所指出的那样,你的逻辑存在一些问题。解决方案是提供此代码:
ir[, c("Species", "Species2") := lapply(.SD, as.character), .SDcols = facs]
sapply(ir, class)
在上一个 if(i==1)
chFirst=chmod;
语句中,如下所示:
if