C 接受输入的Linux非确定性行为

C 接受输入的Linux非确定性行为,c,C,我编写了这个函数: char* input(char* buffer, FILE* fp) { char* result=fgets(buffer,LMAX,fp); if(result!=NULL) { const unsigned int length=strlen(buffer); if(buffer[length-1]=='\n') buffer[length-1]='\0'; } return result; }

我编写了这个函数:

char* input(char* buffer, FILE* fp)
{
    char* result=fgets(buffer,LMAX,fp);
    if(result!=NULL)
    {
    const unsigned int length=strlen(buffer);
    if(buffer[length-1]=='\n')
        buffer[length-1]='\0';
    }
    return result;
}
如果fp等于stdin,则只需输入一行文本。
我已经用过很多次了,而且很有效。
我只在fp是文件指针的情况下使用fgets的结果,因此在流不适合输入操作的情况下,我必须检查结果是否为NULL。
问题是如果我这样使用它:

char buffer[LMAX];  // LMAX = 100, defined constant
input(buffer,stdin);
puts(buffer);
如果输入像“#dest:a”,则puts打印“#dest”,剪切字符串的其余部分。最大的问题是,此函数正在工作,一小时前(完全相同),如果我输入了像“#dest:a”这样的字符串,puts正在打印“#dest:a”。并且没有任何更改。如果我尝试调试并编写以下内容:

char* input(char* buffer, FILE* fp)
{
    char* result=fgets(buffer,LMAX,fp);
    puts(buffer);  //prints always "#dest :a"
    if(result!=NULL)
    {
    const unsigned int length=strlen(buffer);
    if(buffer[length-1]=='\n')
        buffer[length-1]='\0';
    }
    return result;
}
问题是它在函数中打印“#dest:a”。

这个函数有时工作,有时不工作,我很好,我不能忍受一个不确定的行为,这个问题(可能是一个bug)是什么原因造成的?

我运行了你的代码好几次,除了正确的输出,我什么也得不到,所以我无法重现这个问题。我想我知道问题是什么。试着打电话

    flush(stdin);

在调用输入之前

如果初始化缓冲区呢<代码>字符缓冲区[LMAX]={0}您正在使用的编译器?我想知道你如何编译“const unsigned int length=strlen(buffer)”@Donotalo
const unsigned int length=strlen(buffer)有什么问题?@Banthar:这太奇怪了。我认为常量变量必须在编译时由值初始化。strlen()在编译时不起作用。但是我在VS2010中尝试了上面的代码,没有发现编译器错误@Donotalo因为它是一个自动变量,因此应该存在于堆栈上(在大多数体系结构中),所以它在每次执行(函数)时都被分配。您将其与编译时确实初始化的
静态
相混淆。C标准定义这是做什么的?提示hintfget不会使输入缓冲区变脏,因为它还会读取“\n”字符。您是对的,代码本身不会产生任何错误。我正在使用一个strtok来更改原始字符串的内容(出于某种奇怪的原因)。