我正在尝试在终端上打印数字。数字必须打印在同一位置。因此,应先打印1
,然后再删除1
,然后打印2
,依此类推。我正在使用以下C代码:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
useconds_t milisecs;
milisecs = 500000;
int i;
char buffer[1024];
/* print numbers in-place */
for (i=0;i<10;i++) {
printf("%d\r",i);
fflush(stdout);
usleep(milisecs);
}
/* print numbers in-place using write() */
for (i=0;i<10;i++) {
snprintf(buffer, sizeof(buffer), "%d\r", i);
write(1,buffer,1);
usleep(milisecs);
}
return 0;
}
第一个for循环使用printf()
并按我的预期工作。但是,第二个带有write()
的循环将打印0123456789
。如何获得第二个循环以输出与第一个循环相同的文本?我认为问题与\r
无法识别write()
有关。
答案 0 :(得分:5)
write(1,buffer,1);
仅将一个字符写入stdout
。字符串中的第一位数字。
你想要
write(1,buffer,strlen(buffer));
答案 1 :(得分:2)
缓冲区包含数字和CR(两个字符),但是您只写一个字符。您可以使用strlen()
来确定结果字符串的长度,但是snprintf()
已经返回了该长度,因此使用该值更有效:
int len = snprintf( buffer, sizeof(buffer), "%d\r", i ) ;
write( STDOUT_FILENO, buffer, len ) ;
或
write( STDOUT_FILENO, buffer,
snprintf( buffer, sizeof(buffer), "%d\r", i ) ) ;