我必须向stdout打印一定数量的空格,但这个数字不固定。我正在使用putchar(),但我不确定这是否很快。在C中将特定数量的字符打印到stdout的最快方法是什么?另外,我不能使用系统功能。
谢谢你的帮助!
答案 0 :(得分:3)
我会使用fwrite
。简单。正确。容易。
void put_spaces(int n)
{
static const char SPACES[32] = " ";
for (; n >= 32; n -= 32)
fwrite(SPACES, 32, 1, stdout);
if (n)
fwrite(SPACES, n, 1, stdout);
}
但请注意,天真版本也非常快:
void put_spaces(int n)
{
while (n--)
putchar(' ');
}
为什么快?在大多数系统上,putchar
是一个宏,它在大多数时间直接写入缓冲区。如果你不确定它是否快,正确的答案是描述您的应用程序,而不是“先优化”。
远离malloc
(这是不必要的),puts
(每次调用时都会添加'\n'
)和printf
(这对于一个简单的任务)。
答案 1 :(得分:0)
printf()
允许您调整要打印的空格数,但必须在格式字符串中说明。请here作为参考。
char format[256];
sprintf(format, "%%%ds", number_of_spaces); // creates the format string
printf(format, " ");
答案 2 :(得分:0)
我假设“系统功能”,你的意思是非标准扩展。在这种情况下,这完全取决于你的写作速度最快还是执行速度最快?
如果是前者,假设有一个上限,你可以使用类似的东西:
void outSpaces (unsigned int num) {
static char *lotsaSpaces = " ";
printf ("%*.*s", num, num, lotsaSpaces);
}
如果是后者,这样的事情应该是一个很好的起点:
void outSpaces (unsigned int num) {
static char *hundredSpaces = "<<insert 100 spaces here>>";
while (num >= 100) {
puts (hundredSpaces);
num -= 100;
}
printf ("%*.*s", num, num, hundredSpaces);
}
您需要注意,即使使用输出缓冲,函数调用也会很昂贵。在这种情况下,最好拨打puts
一次输出一百个字符,而不是拨打putchar
一百次。
答案 3 :(得分:0)
也许:
void PrintSpaces (int num_spaces)
{
char *spaces = " "; /* twenty spaces */
while (num_spaces > 20)
{
puts (spaces);
num_spaces -= 20;
}
if (num_spaces)
{
puts (&spaces [19 - num_spaces]);
}
}
答案 4 :(得分:0)
我会尝试使用系统命令而不是自己创建。
类似的东西:
void print_spaces(unsigned int number_of_spaces) {
char* spaces = malloc(sizeof(char)*number_of_spaces + 1);
memset (spaces,' ',number_of_spaces);
spaces[number_of_spaces] = '\0';
printf("%s",spaces);
free(spaces);
}
会做到这一点。
答案 5 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
int main() {
const size_t size = 5;
char* const data = (char*)malloc(size * sizeof(char) + 1);
if (!data) {
return EXIT_FAILURE;
}
memset(data, ' ', size);
data[size] = '\0'; // not needed (in this case)
fwrite(data, sizeof(char), size, stdout);
free(data);
return EXIT_SUCCESS;
}
(如果空格的数量不是很大)
答案 6 :(得分:0)
我不知道c,但这是基本的想法。 创建一个大小为8192的数组,并用空格完全填充该特定数组,现在您可以使用put或write系统调用或使用有效的东西,然后打印此数组。 在这里我有一个代码片段,但是如果你更喜欢c,你可以看到example你如何做到这一点,它实际上是GNU的是程序,在打印东西时速度很快,有随后的解释
package main
import (
"bufio"
"os"
)
func main() {
t := []byte{'y', '\n'}
var used int
const tot = 8192
buf := make([]byte, 0, tot)
for used < tot {
buf = append(buf, t...)
used += 2
}
//Filled complete array named as buf with "y\n"
w := bufio.NewWriter(os.Stdout)
for {
w.Write(buf) //using write system call to print.
}
w.Flush()
}
//syscall.Write({without buf}) : 1.40MiB/s
//syscall.Write(buf) : 1.5GiB/s