帮助scanf在Big Endian系统上表现不同

时间:2011-05-09 13:07:23

标签: c scanf

我的代码应该从用户读取一行,如果该行以“ output ”开头,则打印出“ Line is output is ”并等待用户输入另一行。

如果该行以“ input ”开头,则会打印出“ Line is input ”并终止。

我的代码在英特尔PC上工作正常,但是在Debian SPARC上,似乎scanf在第一次之后不等待输入,只是无限地读取空行或其他东西。

我在哪里错了?

#include <stdio.h>
#include <string.h>

int main()
{
char buf[9000];
char key[5];
char *p=buf;

int readMore=1;

while(readMore)
{
    //read in one line from stdin into buffer
    scanf("%[^\n]",buf);
    fflush(stdin);

    sscanf(p, "%s",key); //get key from buffer
    printf("Key:%s\n",key); //print key

    if (strcmp("output",key)==0)
    {
        printf("Line is output\n");

    }
    if (strcmp("input",key)==0)
    {
        readMore=0;
        printf("Line is input\n");

        fflush(stdin);
        getchar();
        return 0;
    }
    key[0]=0;
    buf[0]=0;
}  //end while

return 0;
}

修正如下:

......
int bytes_read;
int nbytes = 100;

while(readMore)
{

      /* These 2 lines are the heart of the program. */
      p = (char *) malloc (nbytes + 1);
      bytes_read = getline (&p, &nbytes, stdin);
....

1 个答案:

答案 0 :(得分:4)

这不是一个endian问题。这是关于如何在不同平台上执行标准输入的缓冲。基本上,你不能在标准输入(或任何其他输入流)上使用fflush() - C标准说这样做是未定义的。