Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数不以return语句结尾_C_String_Return - Fatal编程技术网

C 函数不以return语句结尾

C 函数不以return语句结尾,c,string,return,C,String,Return,我是C语言新手,但我知道编码的基本原理。但是,我不明白编译器返回错误的原因: 函数“.”不以return语句结尾 这是我的密码: string same_start_end(string s) { char first_letter = string_charat(s, 0); string empty = ""; if( string_length(s) <= 1) { return s; } else if (string_length(s) &g

我是C语言新手,但我知道编码的基本原理。但是,我不明白编译器返回错误的原因:

函数“.”不以return语句结尾

这是我的密码:

string same_start_end(string s)

{
  char first_letter = string_charat(s, 0);
  string empty = "";
  if( string_length(s) <= 1)
  {
      return s;
  }
  else if (string_length(s) > 1)
  {
      for (int  i = 0; i < string_length(s); i++)
      {
          if( (string_charat(s, i) == first_letter) && (i != 0))
          {
              return string_sub(s, 0,i);
          }
      }
  }

}
字符串相同\u开始\u结束(字符串s)
{
字符第一个字母=字符串字符(s,0);
字符串为空=”;
如果(字符串长度为1)
{
对于(int i=0;i
您的
if
else if
语句中只有返回。如果这两个都失败了,那么就没有返回语句。考虑做和<代码> E/<代码>,而不是在< <代码> >下执行<代码> >或在所有这些代码之后都有一个返回语句。

编辑:


如果对for循环进行迭代,它不会返回任何内容,而且它也不会触发if语句。编译器警告说,控件可能会到达非void函数的末尾,因为控件可能会到达非void函数的末尾

要防止出现这种情况,必须执行以下操作之一:

  • 禁用编译器警告。(使用Clang时,命令行选项
    -Wno return type
    会执行此操作。)(在C中,如果调用方不尝试使用返回值,则允许非void函数从函数末尾流出而不返回值。)
  • 使编译器清楚地看到函数返回
编译器不清楚函数返回的路径有两条

首先,考虑:

if (string_length(s) <= 1)
   …
else if (string_length(s) > 1)
for (int  i=0; i<string_length(s);i++)
    {
      if( (string_charat(s,i)==first_letter) && (i!=0))
        {
          return string_sub(s, 0,i);
        }
    }
如果未被触发,则此循环可以结束。
s
中可能没有与第一个字符相等的字符,因此永远不会执行
返回。然后循环完成,控制流到函数末尾,而不使用
return
语句


为了防止出现这种情况,可以在
for
循环之后插入
return
语句。当没有找到匹配项时,它将返回任何想要返回的值。

使用C和C++时,在定义函数时必须小心。通过编写

string
,您告诉编译器此函数必须返回一个字符串。如果不想这样做,请尝试切换到
void
,因为void不会返回值。如果您想使用void,但仍然让外部函数知道变量,那么应该使用指针。在您的例子中,返回有时并不例外

“我不明白编译器为什么返回此错误”,因为编译器只是一个编译器。因为它不以return语句结尾?理解你的if-else-if是详尽无遗的可能还不够聪明。写if-else。@Lundin:“if-else”:我怀疑这是否有用,因为它可能无法预先确定
string\u charat()
将做什么。但是,这又是一场猜测比赛。如果你的两条
return
语句中没有一条会发生,会发生什么?如果循环刚刚结束,会发生什么?@Lundin:它不是详尽的。当执行外部
else
时,它内部的循环并不总是执行
return
。只有
else
不会有帮助,因为当前的
return
语句都是有条件的。如果没有一个条件是真的,那么循环将完成,函数将在没有任何无条件返回的情况下运行。即使我将其保持为“如果其他”,我也会收到相同的消息@某个程序员,你是对的。如果循环完成且if从不触发,则存在一个没有结果的路径。需要有一个与if分开的return语句。如果所有其他方法都失败了,并且您觉得自己已经涵盖了所有的基础,那么在函数末尾放上
return 0
,返回0是完全错误的,因为函数承诺返回字符串:),我明白您的观点,但是编译器是如何看待这些可能性的,我的意思是没有语法error@Mer_如果存在未解析的可能代码路径,编译器将捕获它。每次都需要返回一些东西,因为函数期望返回一些东西