试图创建一个程序,将用户输入字符串与C中的一组预定义输入字符串进行比较
我目前正在开发一个程序,将一组输入字符串与用户输入进行比较。唯一的条件是我不允许使用内置的字符串操作;我必须从头开始编写代码 输入字符串是一个字符串数组,如下所示:试图创建一个程序,将用户输入字符串与C中的一组预定义输入字符串进行比较,c,string,user-input,C,String,User Input,我目前正在开发一个程序,将一组输入字符串与用户输入进行比较。唯一的条件是我不允许使用内置的字符串操作;我必须从头开始编写代码 输入字符串是一个字符串数组,如下所示: char *input_strings[] = { "Hello", "What is your name?", "How are you?", "Bye" }; 我目前拥有的是一系列功能: 1) uppercheck,用于检查值是否为大写: int uppercheck(int c){ return (c &g
char *input_strings[] = {
"Hello", "What is your name?", "How are you?", "Bye"
};
我目前拥有的是一系列功能:
1) uppercheck,用于检查值是否为大写:
int uppercheck(int c){
return (c >= 'A' && c <= 'Z');
}
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("Hello\n");
}
else if (compstr(input_strings[1], input) == 1)
{
printf("My name is Name\n");
}
else if (compstr(input_strings[2], input) == 1)
{
printf("I am fine\n");
}
//exit condition:
else if (compstr(input_strings[3], input) == 1)
{
printf("Bye\n");
break;
}
//invalid input:
else
{
printf("I do not understand\n");
}
}
return 0;
我的问题是,对于任何输入,程序都会输出“Hello”,即使根本没有输入。我以为compare函数会确保两个字符串是相同的,但它似乎不起作用,我不知道如何从这里开始处理它。抱歉,如果我输入的代码太多,但我想我会尽可能多地添加信息。任何帮助都将不胜感激 总之,您忘了在
小写
函数中写入return
,并且没有设置中断代码>后<代码>结果=0代码>并且代码应该可以正常工作
说明:
您的代码中只有一个位置打印Hello
,因此我们知道表达式printf(“Hello\n”)
在每个循环中都会执行。这意味着此表达式正上方的if
语句每次都被求值为true
,只有在函数compstr()
始终返回1
时才会发生这种情况,无论输入是什么。现在,让我们深入研究compstr()
函数,看看1
来自何处
如果小写(str1[i])
等于小写(str2[i]),则变量result
设置为1
。好的,我们的问题是lowercase(str1[i])
总是和lowercase(str2[i])
一样。检查您的lowercase()
函数。您根本没有在函数中编写任何return语句,因此无论c
是什么,它都将始终返回一个垃圾号。基本上,您所要做的就是更改c+0x20
to返回c+0x20代码>和c
to返回c代码>。就这样。非常简单的错误
现在,更大的问题是在赋值result=0之后没有break语句在compstr()
函数中的code>如下所示:
。。。
否则{
结果=0;
打破
}
...
为什么这个休息很重要?嗯,只有当str1
比str2
长时,它才相关。请参阅,您的for
循环的终止条件仅涉及str1
,因此即使我们到达str2
中的最后一个字符,如果str1
比str2
长,我们仍然保持循环。让我们看一个示例场景。让我们运行程序并键入Hello
。程序将Hello
存储在input
中,如下input={'H','e','l','l','o','\0',…}
,然后使用compstr()
检查第一个输入条件并打印Hello
。现在键入Bye
。现在,数组input
是{'B','y','e','\0','o','\0',…}
。注意Hello
中的o
仍然存在吗?compstr
中的for
循环将在第一个字符比较时将结果设置为0
,这很好,但没有中断,即使在比较Bye
中的最后一个e
之后,它仍将继续循环,因为您将它与Hello
进行比较,后者有5个字符,而不是3个。在最后一个循环中,您的if
语句将比较Hello
的第5个字符和Bye
的第5个字符,这两个字符都是字母o
。因此,在循环结束时,result
设置为1
,因此compstr
函数返回1
,然后程序打印Hello
,而不是Bye
,即使您键入了Bye
,因为Bye
比Hello
短。试试看,你好吗?
它会正常打印我很好
,但是现在如果你键入你好
或再见
,你仍然会得到我很好
,因为输入
看起来像这样:H',e',l',o','\0',e','y','o','u','?','0'.
。最后的e you?
是在同一个input
变量中存储How are you?
时返回的几步后的垃圾值。函数(3)将为具有相同第一个字符的两个字符串返回1,而不是多通解决方案,您可能需要执行一个单一过程,其中有一个查找表来进行小写转换,然后比较字符串a和B中重新映射的值,看看它们是否相等。逐字符移动,如果长度不匹配或值不匹配,则停止。我建议使用一个函数来获取长度,使用一个小写函数来减少重复代码的数量,并让您自己更清楚。@EugeneSh。for循环是否不在整个字符串上迭代?或者return会阻止循环完全迭代吗?我是C语言的新手,所以我正在尝试解决这些小问题。您可以使用
中的字符类型函数吗?它们不是字符串函数,所以您名义上应该能够这样做。如果是这样,请使用它们:isupper
和tolower()
似乎是您想要的-尽管您可以通过注意tolower()
只更改大写字母来加快速度;其他任何东西都要通过unchan
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("Hello\n");
}
else if (compstr(input_strings[1], input) == 1)
{
printf("My name is Name\n");
}
else if (compstr(input_strings[2], input) == 1)
{
printf("I am fine\n");
}
//exit condition:
else if (compstr(input_strings[3], input) == 1)
{
printf("Bye\n");
break;
}
//invalid input:
else
{
printf("I do not understand\n");
}
}
return 0;