[英]Order of printing with printf and my own print
在我正在做的作业中,我需要创建自己的库,该库应包含一个函数,用于打印字符串( prints
),打印整数( printi
)并返回打印的字符数。 该库应使用内联汇编语言编写(不使用任何stdio.h库)
问题是一切工作正常,但我无法理解调用printf
和printi
的顺序。
这是我的代码:
我自己的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.