C程序无法打印行,已尝试刷新

时间:2019-02-16 10:13:23

标签: c visual-studio-2012 printf scanf fflush

该程序应获取用户的名字和姓氏,然后将其打印为姓氏和名字。程序在第二次输入后立即停止。我尝试了fflush(stdout),但似乎没有用(我可能做错了)。

<div class="container col-lg-3">
   <div class="col-md-12">
      <h1 class="text-center">Lorem Ipsum<hr/></h1>
      <div class="row">
           <a class= "col-md-10 col-sm-3" href="Lorem Ipsum.html">
            <img data-src="holder.js/200x200" class="img-fluid mx-auto d-block shadow" alt="200x200" src="https://upload.wikimedia.org/wikipedia/commons/1/1b/Square_200x200.png" data-holder-rendered="true">
           </a>
           <a class= "col-md-10 col-sm-3" href="Lorem Ipsum.html">
            <img data-src="holder.js/200x200" class="img-fluid mx-auto d-block shadow" alt="200x200" src="https://upload.wikimedia.org/wikipedia/commons/1/1b/Square_200x200.png"data-holder-rendered="true">
           </a>
           <a class= "col-md-10 col-sm-3" href="Lorem Ipsum.html">
             <img data-src="holder.js/200x200" class="img-fluid mx-auto d-block shadow" alt="200x200" src="https://upload.wikimedia.org/wikipedia/commons/1/1b/Square_200x200.png"data-holder-rendered="true">
           </a>
           <a class= "col-md-10 col-sm-3" href="Lorem Ipsum.html">
                <img data-src="holder.js/200x200" class="img-fluid mx-auto d-block shadow" alt="200x200" src="https://upload.wikimedia.org/wikipedia/commons/1/1b/Square_200x200.png" data-holder-rendered="true">
           </a>
        </div>
    </div>
</div>

3 个答案:

答案 0 :(得分:1)

程序的C ++版本:

#include <iostream>
using namespace std;

int main()
{ 
  string first, last;

  cerr << "Please type in your First Name: ";
  if (! (cin >> firs))
    return -1;

  cerr << "Please type in your Last Name: ";
  if (! (cin >> last))
    return -1;

  cout << last << ' ' << first << endl;

  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra i.cc
pi@raspberrypi:/tmp $ ./a.out
Please type in your First Name: aze
Please type in your Last Name: qsd
qsd aze
pi@raspberrypi:/tmp $ 

我检查是否输入了姓名(没有EOF),我使用 cerr 来确保在不编写 endl

的情况下刷新消息

和C版本:

#include <stdio.h>

int main()
{ 
  char first[30], last[30];

  fprintf(stderr, "Please type in your First Name: ");
  if (scanf("%29s", first) != 1)
    return -1;

  fprintf(stderr, "Please type in your Last Name: ");
  if (scanf("%29s", last) != 1)
    return -1;

  printf("%s %s\n", last, first);

  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra i.c
pi@raspberrypi:/tmp $ ./a.out
Please type in your First Name: aze
Please type in your Last Name: qsd
qsd aze

我限制了 scanf 中的大小以不写出数组,我检查了 scanf 是否能够读取名称,我还使用了 stderr < / em>以确保刷新消息时不写'\ n'

first last 是数组,在 scanf 中使用'&'给出地址

是没有用的

请注意,这些版本不允许使用空格输入组成名称,以允许需要读取所有行

答案 1 :(得分:0)

这有助于考虑fflush()调用的目的。您希望用户看到待处理的数据,以便他们知道要键入什么。

让我们考虑第一个查询(printf,scanf,flush)。 printf()将数据放入缓冲区。然后scanf()读取用户的响应。直到用户键入内容后,flush()才会执行。

这三个呼叫顺序错误。我将修复它留给读者练习。

现在考虑下一个查询(printf,scanf)。 printf()将数据放入缓冲区。 scanf()读取用户的响应,但用户尚未看到“ ... Last Name:”提示。

很显然,该区块中也存在错误。再次,我将修复该问题作为读者的练习。提示:如果您解决了第一个错误,应该可以帮助您理解第二个错误。

顺便说一下,scanf()不能防止First []和Last []数组溢出。不必回答您的原始问题,但是我提到了它,因为即使在您修复了代码之后,它仍然是不安全的。

答案 2 :(得分:0)

您拥有的export const clearReducersState = (history) => dispatch => { history.push('/dashboard') } 并没有帮助,因为它在代码中为时过早,因为它无助于刷新后面的printfs。 您也可以使用fflush(stdout);进行刷新。但是,如果您的输出设备不是交互式的(例如,重定向到文件。

\n格式说明符还存在另一个问题:scanf()First是数组,在传递给scanf时会衰减为指针。因此,您将错误的 type 参数传递给scanf-只需从scanf调用中删除Last即可。

所以您的程序可以简单地是:

&

如果您可以在所有printf调用中使用#include <stdio.h> int main(void) { char First[30], Last[30]; printf("Please type in your First Name: "); scanf("%s", First); fflush(stdout); printf("Please type in your Last Name: "); scanf("%s", Last); fflush(stdout); printf("%s %s\n", Last, First); fflush(stdout); getchar(); return 0; } ,则可能不需要所有fflush(stdout)调用,因为您很可能使用的是交互式终端。

如果您使用的是C ++,则应该使用iostream进行I / O。如果没有其他要求,请scanf is a terrible, has many problems, and should be avoided