试图创建一个程序,将用户输入字符串与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;