不获取任何输出(预期布尔输出)

getting no output (expecting boolean output)

提问人:ggbet121 提问时间:10/14/2020 最后编辑:Vlad from Moscowggbet121 更新时间:10/14/2020 访问量:123

问:

所以我试着不使用 string.h 文件。我创建了有效的字符串长度函数。然后我创建了一个函数来检查两个函数是否相同,但我没有得到任何输出。 我已经测试了字符串长度函数,并且有效。我不确定我在第二个函数中做错了什么。请指出错误。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

char stringLength(char userString[])
{
    int i=0,count=0;
    while (userString[i] != '\0')
    {
        count = (count + 1);
        i = (i + 1);
    }
    return count;

}


bool stringCheck (char a[], char b[])
{
    bool isEquals = false;
    if (stringLength(a) == stringLength(b))
    {
        int i=0, count=0;
        while (i<stringLength(a))
        {
            if (a[i] == b[i])
            {
                count+=1;
            }

            i+=1;
        }

        if (count == stringLength(a))
            isEquals = true;
        else
            isEquals = false;
    }
    else
        isEquals = false;

    return isEquals;
}

int main()
{
    stringCheck("abcd", "abcd");
    return 0;
}
相等 c-strings 返回类型 function-definition

评论

0赞 kaylum 10/14/2020
您尚未存储 从 调用时的返回值。那么,您如何确定函数失败呢?如果这不是问题所在,则在调试器中逐行单步执行代码。stringCheckmain
0赞 kaylum 10/14/2020
附带说明:对同一字符串进行多次调用效率低下。最好将长度存储在变量中,并在需要的地方使用它。stringLength
0赞 Ian Abbott 10/14/2020
另一个旁注:使用返回类型 for 意味着它仅适用于某些平台上长度不超过 127 个字符的字符串,而在某些其他平台上仅适用于长度不超过 255 个字符的字符串。由于您使用变量来保存长度,因此最好使用 return type 。(实际上,最好使用而不是,因为这与函数匹配。charstringLengthintintsize_tintstrlen
0赞 Lundin 10/14/2020
没有产生任何形式的输出的函数可以解释缺乏输出的原因。

答:

0赞 WedaPashi 10/14/2020 #1

该函数有效。

只是你没有捕捉到函数的返回值。您可以按如下所示执行此操作。stringCheck()

bool strMatch = stringCheck("abcd", "abcd");
if(true == strMatch)
{
    // Do something when the strings are same
}
else
{
    // Do something else otherwise
}

此外,作为改进 - 在功能上,你有一个循环stringCheck()

while (i < stringLength(a))

这没有错,但您可以通过将字符串的长度保存到变量中并使用该变量在循环中进行轮询来提高代码的效率。 在功能上:whilestringCheck

int i=0, count=0;
char strLength = stringLength(a);
while (i < strLength)

这将起作用,因为字符串的长度在循环中没有变化。

我发现功能有问题。首先是,用于返回长度的变量的数据类型是 ,而为函数设置的返回类型是 。此外,请考虑将函数的返回类型与同一函数中变量的数据类型一起更改为。stringLength()countintcharstringLength()size_tcount

char stringLength(char userString[])

size_t stringLength(char userString[])

如果返回类型为 ,如果字符串的长度超过 127 个字节,则函数将行为异常。char

该功能的下一个改进是,并且似乎同时更新。我想不出为什么你需要两个变量,而你可以简单地返回代替 .stringLength()icounticount

如果你使用某些 gcc 标志(例如开头)编译代码,你的编译器会警告你所有这些要点。-Wall

0赞 klutt 10/14/2020 #2

正如 @WedaPashi 所说,您的代码是有效的。你只需要使用结果。

但是你的代码过于复杂。绝对没有理由在第一个函数中使用两个变量。此外,第一个函数不应返回字符(除非您希望该函数不能处理长度超过 127 或 255 个字符的字符串) 使用或最好改为。这样做:intsize_t

size_t stringLength(char userString[])
{
    int count=0;
    while (userString[i] != '\0') 
        count++;

    return count;
}

对于您的第二个函数,只是浪费时间比较它们的长度。下面是一个更简单的实现:

bool stringCheck (char a[], char b[])
{
    size_t index = 0;
    while(a[index] != '\0') {
        if(a[index] != b[index]) return false;
        index++;
    }

    return true;
}

如果需要,还可以添加一些检查参数是否为空指针。

评论

1赞 ggbet121 10/14/2020
有 我意识到我把它弄得太复杂了。我刚开始学习C语言。非常感谢您指出更好的解决方案!
0赞 Vlad from Moscow 10/14/2020 #3

您没有使用 中函数的返回值stringCheckmain

int main()
{
    stringCheck("abcd", "abcd");
    return 0;
}

至少你可以写例如

int main( void )
{
    printf( "Strings are %sequal\n", stringCheck("abcd", "abcd") ? "" : "not " );
    return 0;
}

除此之外,您的代码效率非常低,通常甚至可以调用未定义的行为。

例如,该函数将返回包含多个字符的字符串的不正确长度,具体取决于类型的行为是类型还是 。stringLength127255charsigned charunsigned char

该函数应声明为

size_t stringLength( const char userString[] )
{
    size_t count = 0;

    while ( userString[count] != '\0' ) ++count;

    return count;
}

或者,例如,在函数中,为循环中变量的每个值调用函数stringCheckstringLengthi

    int i=0, count=0;
    while (i<stringLength(a))
             ^^^^^^^^^^^^

函数参数应使用限定符声明,因为传递的字符串不会在函数中更改。const

事实上,这个功能是多余的。无需使用函数即可编写该函数,这要简单得多。stringLengthstringCheckstringLength

给你。

bool stringCheck( const char *s1, const char *s2 )
{
    while ( *s1 && *s1 == *s2 )
    {
        ++s1;
        ++s2;
    }

    return *s1 == *s2;
}