将char *作为函数参数传递会出现意外情况

时间:2014-01-22 22:36:40

标签: c++ c function char arguments

我正在为考试提供有关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

}

4 个答案:

答案 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;

这将在第一次迭代后退出循环。

我建议您格式化代码以便于阅读。