我目前正在开发一个程序,该程序会将一组输入字符串与用户输入进行比较。唯一的条件是不允许我使用内置字符串操作;我必须从头开始编写它们。
输入字符串是一个字符串数组,如下所示:
char *input_strings[] = {
"Hello", "What is your name?", "How are you?", "Bye"
};
我目前拥有的是一堆功能:
1) uppercheck,它检查一个值是否为大写:
int uppercheck(int c){
return (c >= 'A' && c <= 'Z');
}
2) 小写,将值转换为小写:
int lowercase(int c){
if (uppercheck(c)){
c + 0x20;
}
else{
c;
}
}
3) compstr,它比较两个小写字符串:
int result;
int compstr(char str1[], char str2[]){
for(int i = 0; str1[i]; i++){
if (lowercase(str1[i]) == lowercase(str2[i])){
result = 1;
}
else{
result = 0;
}
}
return result;
}
我的代码的后半部分检查用户字符串是否等于 input_strings 数组中的每个条目,如下所示:
char input[100]; // user input string
while (1) // infinite loop
{
//Get the input string
printf("> ");
fgets(input, 100, stdin);
// comparing strings:
//3 base input conditions:
if (compstr(input_strings[0], input) == 1)
{
printf("Hellon");
}
else if (compstr(input_strings[1], input) == 1)
{
printf("My name is Namen");
}
else if (compstr(input_strings[2], input) == 1)
{
printf("I am finen");
}
//exit condition:
else if (compstr(input_strings[3], input) == 1)
{
printf("Byen");
break;
}
//invalid input:
else
{
printf("I do not understandn");
}
}
return 0;
我的问题是程序将为任何输入输出"Hello",即使根本没有输入。我以为比较函数会确保两个字符串相同,但它似乎不起作用,我不确定如何从这里开始处理它。抱歉,如果我过度编写代码,但我想我会添加尽可能多的信息。任何帮助将不胜感激!
总之,您忘记在lowercase
函数中编写return
,并且您没有在result = 0;
之后放置break;
,代码应该可以正常工作。
解释:
代码中只有一个地方打印Hello
因此我们知道表达式printf("Hellon")
在每个循环中都在执行。这意味着紧靠此表达式上方的if
语句每次都会被计算为true
,这只有在函数compstr()
始终返回1
而不管input
是什么时才会发生这种情况。现在,让我们深入了解compstr()
函数,看看1
来自哪里。
好吧,如果lowercase(str1[i])
变量result
等于lowercase(str2[i])
,则变量设置为1
。好的,所以我们的问题是lowercase(str1[i])
总是和lowercase(str2[i])
一样。检查您的lowercase()
功能。您根本没有在函数中编写任何 return 语句,因此无论c
是什么,它都将始终返回垃圾编号。基本上,您所要做的就是将c + 0x20;
更改为return c + 0x20;
,c;
更改为return c;
。就是这样。非常简单的错误。
现在,更大的问题是,在compstr()
函数中分配result = 0;
后,您没有 break 语句,如下所示:
...
else{
result = 0;
break;
}
...
为什么这个休息很重要?好吧,只有当str1
比str2
长时才有意义.看,for
循环的终止条件只涉及str1
,所以即使我们到达str2
中的最后一个字符,如果str1
长于str2
,我们仍然会继续循环。让我们看一个示例场景。让我们运行程序并键入Hello
。程序将Hello
存储在input
中,就像这样input = {'H', 'e', 'l', 'l', 'o', ' ', ...}
,然后用compstr()
检查第一个输入条件并打印Hello
。现在键入Bye
.现在,数组input
已{'B', 'y', 'e', ' ', 'o', ' ', ...}
。注意到Hello
的o
还在那里吗?compstr
中的for
循环将result
设置为在第一个字符比较时0
,这很好,但没有中断,即使在比较Bye
中的最后一个e
后,它也会继续循环,因为您正在将其与具有 5 个字符而不是 3 个字符的Hello
进行比较。在最后一个循环中,您的if
语句将比较Hello
的第 5 个字符和Bye
的第 5 个字符,这是两者的字母o
。所以result
在循环结束时设置为1
,所以compstr
函数返回1
然后程序打印Hello
而不是Bye
,即使你输入了Bye
,因为Bye
比Hello
短。尝试,How are you?
,它会正常打印I am fine
,但现在如果你输入Hello
或Bye
,你仍然会得到I am fine
,因为input
看起来像这样:'H', 'e', 'l', 'l', 'o', ' ', 'e', ' ', 'y', 'o', 'u', '?', ' ' ...
.最后的e you?
是当我们How are you?
存储在这个相同的input
变量中时,几步后的垃圾值。