Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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中_C_User Input_Fgets_Fputs - Fatal编程技术网

';控件到达非无效函数的末尾';在C中

';控件到达非无效函数的末尾';在C中,c,user-input,fgets,fputs,C,User Input,Fgets,Fputs,我正在尝试读取用户的输入。当我编译程序时,我得到一条消息,“控件到达非void函数的末尾[-Wreturn type] }" 我希望程序接收用户的输入,按enter键,然后将他们的输入打印回给他们。我必须用我用过的方法来做(这是一些家庭作业的一部分) 我不完全知道在C的引擎盖下发生了什么,所以它只是导致了一些类似这样的问题:)。对于初学者来说,函数有未定义的行为,因为它使用了一个统一的指针 如果函数的返回类型不是void,则函数应具有返回语句 看来你的意思是 #include <stdio

我正在尝试读取用户的输入。当我编译程序时,我得到一条消息,“控件到达非void函数的末尾[-Wreturn type] }"

我希望程序接收用户的输入,按enter键,然后将他们的输入打印回给他们。我必须用我用过的方法来做(这是一些家庭作业的一部分)


我不完全知道在C的引擎盖下发生了什么,所以它只是导致了一些类似这样的问题:)。

对于初学者来说,函数有未定义的行为,因为它使用了一个统一的指针

如果函数的返回类型不是void,则函数应具有返回语句

看来你的意思是

#include <stdio.h>

void read_line( char *buf, size_t sz ) 
{
    while( fgets(buf, sz, stdin) && buf[0] != '\n' ) 
    {
        fputs(buf, stdout);
    }
}

int main( void ) 
{
    enum { N = 1024 };
    char buf[N];

    read_line( buf, N );
}
#include <stdio.h>

char * read_line( char *buf, size_t sz ) 
{
    if  ( fgets(buf, sz, stdin) && buf[0] != '\n' ) 
    {
        return buf;
    }
    else
    {
        return NULL;
    }
}

int main( void ) 
{
    enum { N = 1024 };
    char buf[N];

    char *p = read_line( buf, N );\

    if ( p != NULL ) fputs( p, stdout );
}
#包括
无效读取行(字符*buf,大小为sz)
{
而(fgets(buf,sz,stdin)和&buf[0]!='\n')
{
FPUT(buf、标准输出);
}
}
内部主(空)
{
枚举{N=1024};
char-buf[N];
读线(buf,N);
}
或者像下面这样

#include <stdio.h>

void read_line( char *buf, size_t sz ) 
{
    while( fgets(buf, sz, stdin) && buf[0] != '\n' ) 
    {
        fputs(buf, stdout);
    }
}

int main( void ) 
{
    enum { N = 1024 };
    char buf[N];

    read_line( buf, N );
}
#include <stdio.h>

char * read_line( char *buf, size_t sz ) 
{
    if  ( fgets(buf, sz, stdin) && buf[0] != '\n' ) 
    {
        return buf;
    }
    else
    {
        return NULL;
    }
}

int main( void ) 
{
    enum { N = 1024 };
    char buf[N];

    char *p = read_line( buf, N );\

    if ( p != NULL ) fputs( p, stdout );
}
#包括
字符*读取行(字符*buf,大小为sz)
{
如果(fgets(buf,sz,stdin)和&buf[0]!='\n')
{
返回buf;
}
其他的
{
返回NULL;
}
}
内部主(空)
{
枚举{N=1024};
char-buf[N];
char*p=读取线(buf,N)\
如果(p!=NULL)fput(p,stdout);
}

您从未从
读取行返回任何内容。您真的希望它是
char*
,还是希望它不返回任何内容,而是
void
buf
没有指向任何内容。您可能需要一个数组而不是指针;最好添加
返回0(或其他合适的错误代码)在该函数的末尾。在我的问题单中,该方法的类型和参数以代码中的方式提供给我们-我只需要解决这个问题。我对此感到非常困惑,因为我对C非常陌生。@SteveFriedl
main
的特殊之处在于它默认返回0。我对此表示感谢,但我的作业表希望我们在方法中使用“char”而不是“void”。@JakeJackson考虑到您编写的与作业相关的内容,这是没有意义的。C标准确实如此不要求函数具有
return
语句,即使它具有非void返回类型,并且到达具有非void返回类型的函数末尾本身并不具有未定义的行为。这会编译,但当我输入诸如“name”之类的内容时,它只会说“Segmentation fault(core dumped)“.@JakeJackson这是因为您的代码表现出未定义的行为,因为它将数据填充到
main
中的不确定指针指向的内存中,该指针传递给
read\u line
。这也是一个与你发布的问题完全不同的问题。这个答案对于您提出的问题是正确的(为什么会发出警告),尽管它肯定可以更好地解释什么是固定的,以及为什么。只有代码的答案通常很糟糕。对于这样一个初学者的问题,也许你可以添加一个解释而不是代码转储。