我正在为考试提供有关c / c ++的一些常见问题。其中一个问题是描述函数leer(char * a)返回的值。我希望函数返回c字符串中的空格数,但是我的测试表明,leer实际上只检查第一个char,因此如果第一个元素是空格则返回1,否则返回0。它甚至不遍历字符串,但在检查第一个字符后返回,而main函数内部的相同循环计算所有空格,就像我最初想的那样。我不明白为什么它们的行为不同,因为leer的参数与我在main函数中的for循环中使用的参数相同。我假设我在这里缺乏一些指针知识,但我无法弄清楚为什么我最初的想法是错误的。
#include <iostream>
int leer(char *a)
{
for(int b=0;*a!='\0';a++)
{
if(*a==' ') b++;
return b;
}
}
int main()
{
char *a = "Dies ist ein Test";
std::cout << leer(a) << std::endl; //Prints 0
int b;
for(b=0;*a!='\0';a++)
{
if(*a==' ') b++;
}
std::cout << b << std::endl; //Prints 3
}
答案 0 :(得分:2)
问题是你在第一次迭代后返回。您需要在循环后放置return
语句:
for(int b=0;*a!='\0';a++)
{
if(*a==' ') b++;
}
return b;
答案 1 :(得分:1)
这两个循环并不完全相同。请注意,在leer
中,return
语句位于循环内。这意味着它将在第一次迭代期间返回,并且实际上没有机会继续通过字符串。
main
中的循环没有阻止它继续通过字符串的任何内容。 b
的值递增,然后在循环后输出。
您的leer
函数应该以相同的方式编写,其中循环后返回b
的值。
答案 2 :(得分:0)
它不能按预期工作的原因是return语句return b;
。它理论上在每次迭代中都会执行,但实际上当然只是在第一次迭代中执行,因为在我们执行它之后我们不再处于for循环中。
答案 3 :(得分:0)
因为在你的主()中你没有回报......就像在
中一样return b;
这将在第一次迭代后退出循环。
我建议您格式化代码以便于阅读。