【问题标题】:User input from console in C来自 C 中控制台的用户输入
【发布时间】:2012-08-21 19:17:40
【问题描述】:

我是 C 编程的完全初学者,所以请耐心等待。我正在尝试在控制台中输入用户的文件名,并且我想打印一条有用的消息,提示用户输入他想要打开的文件名。但是当我在命令提示符下运行它时,光标首先等待输入,在我输入一些文本并按回车后,我看到了我想在输入之前打印的有用提示。这是代码sn-p。

 char filename[40];
 fputs("enter the file name: ", stdout);
 fflush(stdout); 
 fgets(filename, sizeof(filename), stdin);

我看不出我哪里出了问题。如果有人能解释为什么会发生这种情况,我将不胜感激。

【问题讨论】:

  • 我没有发现您的代码有任何问题。
  • 详细说明我的问题。我正在尝试将此 C 程序转换为 gnuarm 汇编代码。所以我正在使用 arm 网站的 gnu 工具链提供的 gcc 编译器。我认为这不重要,但是我不知道如何解决这个问题。这似乎是微不足道的。
  • 这个 C 代码看起来不错。即使您请求了,您的stdout 似乎也没有被正确刷新。我怀疑您的 stdio 库在这方面有一些怪癖。
  • 在哪个操作系统中?你能请吗?检查fflush的返回值,如果是0?
  • 我拿走了你的代码并添加了 printf("%s\n",filename);最后,编译并运行它。它打印我输入的文件名。这不是你得到的吗?

标签: c console user-input


【解决方案1】:

我没有看到您粘贴的代码有任何问题,可以正常使用 gcc。这一定与未刷新标准输出有关,这可能特定于您正在使用的编译器...

【讨论】:

    【解决方案2】:

    这对我有用 gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00):

    char path[100];
    
    printf("Give a path: ");
    
    // Max length of 99 characters; puts a null terminated string in path, thus 99 chars + null is the max
    scanf("%99s", path);
    
    printf("This is your path: %s\n", path);
    

    在 *nix 机器上,在汇编中进行读写:

    read:   mov $0x03, %rax # Syscall Read
            mov $0x00, %rbx # Stdin
            mov $Buff, %rcx # Address to read to
            mov $BuffLen, %rdx  # Bytes to read
            int $0x80           # Call
    
    write:  mov $0x04, %rax # Syscall Write
            mov $0x01, %rbx # Stdout
            mov $Buff, %rcx # Address to write from
            mov $BuffLen, %rdx  # Bytes to write
            int $0x80           # Call
    

    这是我从老师那里得到的一些 Windows 程序集:

    .386
    .MODEL FLAT
    
    ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
    
    GetStdHandle PROTO NEAR32 stdcall, nStdHandle:DWORD
    
    ReadFile PROTO NEAR32 stdcall, hFile:DWORD, lpBuffer:NEAR32, NumberOfCharsToRead:DWORD,
         lpNumberOfBytesRead:NEAR32, lpOverlapped:NEAR32
    
    WriteFile PROTO NEAR32 stdcall, hFile:DWORD, lpBuffer:NEAR32, NumberOfCharsToWrite:DWORD,
         lpNumberOfBytesWritten:NEAR32, lpOverlapped:NEAR32
    
    STD_INPUT  EQU -10
    STD_OUTPUT EQU -11
    
    cr  EQU 0dh
    Lf  EQU 0ah
    
    .STACK
    .DATA
    
    InMsg   BYTE    14 dup (?)
    msgLng  DWORD   $ - InMsg ;
    read    DWORD   ?
    written DWORD   ?
    hStdIn  DWORD   ?
    hStdOut DWORD   ?
    
    .CODE
    _start:
            INVOKE GetStdHandle, STD_INPUT
            mov     hStdIn, eax
            INVOKE ReadFile, hStdIn, NEAR32 PTR InMsg, msgLng, NEAR32 PTR read, 0
        INVOKE GetStdHandle, STD_OUTPUT
        mov hStdOut, eax
            INVOKE WriteFile, hStdOut, NEAR32 PTR InMsg, msgLng, NEAR32 PTR written, 0
        INVOKE ExitProcess, 0
    
    PUBLIC  _start
    END
    

    【讨论】:

    • 感谢@FireLizzard 的反馈,但它似乎仍然不起作用。就像我在使用 arm-elf-run a.out 运行输出文件时需要用户输入时一样,无论我在 scanf 语句之前打印什么,光标都会在控制台上一直闪烁,等待我输入内容。 stdio.h 文件显然被包含在内,因为 scanf 和 printf 函数正在正常工作。有帮助吗?
    • 我认为问题在于,如果我没有在 scanf 之前的 printf 语句中指定“\n”,则输出不会被刷新。我认为这就是为什么控制台希望我返回。所以当我用'\n'做一个printf时,我得到了这个工作。但我仍然不知道为什么。有人可以解释一下吗?这将是一个很大的帮助
    • 这似乎更像是您的编译器、库或目标平台的问题。我以前从未见过这样的事情。这是安卓设备吗?
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 2014-07-30
    • 2021-11-23
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    相关资源
    最近更新 更多