【问题标题】:getting no output (expecting boolean output)没有输出(期望布尔输出)
【发布时间】:2020-10-14 11:06:16
【问题描述】:

所以我尝试不使用 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;
}

【问题讨论】:

  • 当从main 调用时,您还没有存储stringCheck 的返回值。那么您如何确定功能失败?如果这不是问题,那么在调试器中逐行执行代码。
  • 附带说明:在同一字符串上多次调用stringLength 效率低下。最好将长度存储在变量中并在需要的地方使用它。
  • 另一边注:使用返回类型 charstringLength 意味着它仅适用于某些平台上最长为 127 个字符的字符串,而在某些平台上最长为 255 个字符的字符串平台。由于您使用int 变量来保存长度,因此最好使用返回类型int。 (实际上,最好使用size_t 而不是int,因为它与strlen 函数相匹配。)
  • 没有产生任何形式输出的函数可以解释缺乏输出。

标签: c equality c-strings return-type function-definition


【解决方案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))

这并没有什么问题,但是您可以通过将字符串的长度保存到一个变量中并在while 循环中使用该变量进行轮询来提高代码的效率。 在stringCheck函数中:

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

这会起作用,因为字符串的长度不会在循环中改变。

我发现stringLength() 函数存在问题。首先,用于返回长度count 的变量的数据类型是int,而为函数设置的返回类型是char。另外,请考虑将函数 stringLength() 的返回类型更改为 size_t 以及同一函数中变量 count 的数据类型。

char stringLength(char userString[])

size_t stringLength(char userString[])

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

stringLength()函数的下一个改进是,icount似乎同时更新了。当您可以简单地返回 i 代替 count 时,我想不出为什么还需要两个变量。

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

【讨论】:

    【解决方案2】:

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

    但是您的代码过于复杂。绝对没有理由在第一个函数中使用两个变量。此外,第一个函数不应返回 char(除非您希望该函数不适用于长度超过 127 或 255 个字符的字符串)请改用 int 或最好使用 size_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;
    }
    

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

    【讨论】:

    • 是的,我意识到我把它弄得太复杂了。我刚开始学习C语言。非常感谢您指出更好的解决方案!
    【解决方案3】:

    您没有在main 中使用函数stringCheck 的返回值

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

    至少你可以写例子

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

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

    例如,函数 stringLength 将返回不正确长度的字符串,这些字符串的字符数超过 127255,具体取决于 char 类型的行为是否与 signed charunsigned char 类型相同。

    函数应该像这样声明

    size_t stringLength( const char userString[] )
    {
        size_t count = 0;
    
        while ( userString[count] != '\0' ) ++count;
    
        return count;
    }
    

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

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

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

    事实上函数stringLength 是多余的。函数stringCheck可以不使用函数stringLength写得更简单。

    你来了。

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

    【讨论】: