【问题标题】:Issue in C language using 'fgets' after 'printf' as 'fgets' runs before 'printf' [duplicate]在'printf'之后使用'fgets'在C语言中出现问题,因为'fgets'在'printf'之前运行[重复]
【发布时间】:2012-07-19 11:30:28
【问题描述】:

可能重复:
Why does printf not flush after the call unless a newline is in the format string? (in C)

我在使用printffgets 时遇到问题,因为我的代码printf 是在fget 之前编写的,但它没有运行,它在fgets 运行之后运行。

enum { max_string = 127 };
static char string[max_string+1] = "";

int main( int argc, char ** argv ) {    
      printf("Type a String: ");
      fgets(string, max_string, stdin);
      printf("The String is %s\n", string);
      return 0;
}

【问题讨论】:

    标签: c printf fgets


    【解决方案1】:

    刷新stdout

    fflush(stdout);
    

    fgets(...)之前

    printf("Type a String: ");  
    fflush(stdout);
    fgets(string, max_string, stdin); 
    

    【讨论】:

    • 谢谢安德斯...真的非常感谢 :) 明白了..
    【解决方案2】:

    重点不是printffgets之后运行,而是它的输出显示在它之后。

    发生这种情况是因为 标准输出(您使用 printf 编写的文件描述符)是行缓冲的,即标准库在换行符 (\n) 具有已收到打印。

    来自man stdout

    流标准输出在指向终端时是行缓冲的。 在调用 fflush(3) 或 exit(3) 之前,部分行不会出现,或者 打印一个换行符。

    要调查不同的结果,请编辑您的示例以使用 fflush,或使用 fprintf(stderr, ... 打印标准错误。

    【讨论】:

      【解决方案3】:

      printf 语句中添加\n。这可能是问题,因为C 缓冲区是行终止的。

      【讨论】:

        【解决方案4】:

        尼尔是对的。如果你只想写一些东西而不用写'\n',你可以使用函数 write();

        #include <stdio.h>
        #include <unistd.h>
        #include <string.h>
        
        enum { max_string = 127 };
        static char string[max_string+1] = "";
        
        
        my_putstr(char *str)
        {
             write(1, str, strlen(str));
        }
        
        int main( int argc, char ** argv ) {    
            my_putstr("Type a String: ");  
            fgets(string, max_string, stdin); 
            printf("The String is %s\n", string);
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-15
          相关资源
          最近更新 更多