【问题标题】:Passing a char * as function argument behaves unexpected将 char * 作为函数参数传递行为出乎意料
【发布时间】:2014-02-13 06:04:23
【问题描述】:

我在为考试准备一些关于 c/c++ 的一般性问题。其中一个问题是描述函数 leer(char *a) 返回的值。我希望该函数返回 c 字符串中的空格数,但我的测试表明 leer 实际上只是检查第一个字符,因此如果第一个元素是空格,则返回 1,否则返回 0。它甚至不遍历字符串,而是在检查第一个字符后返回,而主函数内部的相同循环计算所有空格,就像我最初想的那样。我不明白为什么它们的行为不同,因为 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

}

【问题讨论】:

  • 与指针无关。查看返回语句。
  • 是的,嗯,这很尴尬 :D 我太专注于指针,以至于我什至没有注意到它。谢谢你指出我会搜索几个小时。

标签: c++ c function char arguments


【解决方案1】:

因为在你的 main() 中你没有返回......就像在

return b;

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

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

【讨论】:

  • 是的,很明显,一旦有人再次将您引导到正确的路径。任务中的原始格式更糟糕,它是:int leer(char *a) { for(int b=0;*a!='\0';a++) if(*a==' ') b++; return b; } 我只是在我的编译器中更改了它,无论出于何种原因。所以这个问题的正确答案既不是空格的数量,也不是第一个字符是否是空格。 b 是在 for 循环的范围内定义的,因此对于 return 是不可见的,唯一会返回的是语法错误,对吧?
【解决方案2】:

它不能按预期工作的原因是返回语句return b;。它理论上在每次迭代中执行,但实际上当然只是在第一次迭代中执行,因为在我们执行它之后,我们不再处于 for 循环中。

【讨论】:

  • 感谢您的回答,我会搜索几个小时:D。完全没有得到它。
【解决方案3】:

问题是您在第一次迭代后返回。您需要在循环之后放置return 语句:

for(int b=0;*a!='\0';a++)
{
    if(*a==' ') b++;
}
return b;

【讨论】:

  • 感谢您的回答,我太专注于指针,我根本没有注意到它。
【解决方案4】:

这两个循环并不完全相同。请注意,在leer 中,return 语句位于循环内。这意味着它将在第一次迭代期间返回,并且实际上永远没有机会继续遍历字符串。

main 中的循环没有任何东西阻止它继续遍历字符串。 b的值递增,循环结束后输出。

您的leer 函数应该以相同的方式编写,其中b 的值在循环之后返回。

【讨论】:

  • 有点明显,但我非常专注于指针的事情:D。无论如何,谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2015-12-23
  • 2018-04-21
  • 2015-09-26
相关资源
最近更新 更多