繁体   English   中英

使用printf和我自己的打印进行打印的顺序

[英]Order of printing with printf and my own print

在我正在做的作业中,我需要创建自己的库,该库应包含一个函数,用于打印字符串( prints ),打印整数( printi )并返回打印的字符数。 该库应使用内联汇编语言编写(不使用任何stdio.h库)

问题是一切工作正常,但我无法理解调用printfprinti的顺序。

这是我的代码:

我自己的Myl库:

/* 
 * print_int.c 
 * A system call to print an integer 
 */
#include "myl.h"  // my own library
#define BUFF 20

int printi(int n){  // my own printi function to print numbers
    char buff[BUFF], zero='0';
    int i=0, j, k, bytes;

    // saveN = n;
    if(n == 0) buff[i++]=zero;
    else{
        if(n < 0) {
            buff[i++]='-';
            n = -n;
        }
        while(n){
            int dig = n%10;
            buff[i++] = (char)(zero+dig);
            n /= 10;
        }
        if(buff[0] == '-') j = 1;
        else j = 0;
        k=i-1;
        while(j<k){
            char temp=buff[j];
            buff[j++] = buff[k];
            buff[k--] = temp;
        }
    } 
    // buff[i]='\n';
    bytes = i;

    __asm__ __volatile__ (
      "movl $4, %%eax \n\t"
      "movl $1, %%ebx \n\t"
      "int $128 \n\t"
      :
      :"c"(buff), "d"(bytes)
    ) ;  // $4: write, $1: on stdin

    return bytes;
}


int prints(char *str){  //my own prints function to print strings
    int i;
    for (i = 0; str[i]!='\0'; ++i) {}

  __asm__ __volatile__ (
    "movl $4, %%eax \n\t"
    "movl $1, %%ebx \n\t"
    "int $128 \n\t"
    :
    :"c"(str), "d"(i)
    ) ;  // $4: write, $1: on stdin
    return i;
}

和我的test.c文件:

#include <stdio.h>
#include "myl.h"
int main()
{ 
    int n,k;
    char s[100];
    printf("Please enter a string: ");
    fflush(stdin);
    scanf("%[^\n]",s);
    k=prints(s);
    printf("\nNO of chars printed = ");

    printi(k);  // number of chars printed
    return 0;
}

一切工作正常,但先打印k,然后再打印未打印NO of chars printed =

这是终端显示的内容:

Please enter a string: asdf
asdf
4NO of chars printed =

我希望它是:

Please enter a string: asdf
asdf
NO of chars printed =4

那订单怎么了...?

尝试fflush(stdout); 就在您的printf() 输出可能被缓冲。

如果stdout是终端,则printf()默认情况下会进行行缓冲。 这意味着除非看到\\n字符,否则它不会调用实际的write()系统调用。 因此,您的printi()首先打印,当程序退出时,字符串将从缓冲区中清除。

您可能应该使用自己的非缓冲prints()

或者确实是fflush(stdout); 在紧随printf之后。

可以禁用stdout缓冲区,调用:

setbuf (stdout,NULL);

将其插入到main的开头,允许混合stdout和实现以保持调用顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM