提问人:ggbet121 提问时间:10/14/2020 最后编辑:Vlad from Moscowggbet121 更新时间:10/14/2020 访问量:123
不获取任何输出(预期布尔输出)
getting no output (expecting boolean output)
问:
所以我试着不使用 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;
}
答:
该函数有效。
只是你没有捕捉到函数的返回值。您可以按如下所示执行此操作。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[])
如果返回类型为 ,如果字符串的长度超过 127 个字节,则函数将行为异常。char
该功能的下一个改进是,并且似乎同时更新。我想不出为什么你需要两个变量,而你可以简单地返回代替 .stringLength()
i
count
i
count
如果你使用某些 gcc 标志(例如开头)编译代码,你的编译器会警告你所有这些要点。-Wall
正如 @WedaPashi 所说,您的代码是有效的。你只需要使用结果。
但是你的代码过于复杂。绝对没有理由在第一个函数中使用两个变量。此外,第一个函数不应返回字符(除非您希望该函数不能处理长度超过 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;
}
如果需要,还可以添加一些检查参数是否为空指针。
评论
您没有使用 中函数的返回值stringCheck
main
int main()
{
stringCheck("abcd", "abcd");
return 0;
}
至少你可以写例如
int main( void )
{
printf( "Strings are %sequal\n", stringCheck("abcd", "abcd") ? "" : "not " );
return 0;
}
除此之外,您的代码效率非常低,通常甚至可以调用未定义的行为。
例如,该函数将返回包含多个字符的字符串的不正确长度,具体取决于类型的行为是类型还是 。stringLength
127
255
char
signed char
unsigned 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;
}
评论
stringCheck
main
stringLength
char
stringLength
int
int
size_t
int
strlen