标签: printf

Eclipse / MiniGW 中的 scanf 问题

我试图在 Eclipse 中运行以下代码,但控制台保持空白,直到我停止程序,此时输出“输入下一个值(<=0 退出)2130567168 分钟是 35509452 小时 48 分钟。” 一遍又一遍地重复。

似乎 scanf 由于某种原因放入了一些默认值......无法弄清楚为什么。在程序停止之前我没有看到任何东西,所以我认为这可能与 printf 没有被刷新有关,但我确保使用 \n 来强制刷新。

有任何想法吗?

#include <stdio.h>
const int MIN_PER_HOUR = 60;  // minutes per hour

int main(void)
{
 int hour, min, left;

 printf("Convert minutes to hours and minutes!\n");
 printf("Enter the number of minutes (<=0 to Quit):\n");

 scanf("%d", &min);    // read number of minutes

 while(min > 0){
  hour = min / MIN_PER_HOUR; // truncated number of hours
  left = min % MIN_PER_HOUR; // number of minutes left …
Run Code Online (Sandbox Code Playgroud)

c eclipse printf scanf

3
推荐指数
1
解决办法
2万
查看次数

使用 ncurses 处理转义序列?printf 是否处理转义序列?

我的程序从网络读取一些文本数据,例如: Hello \033[1;34mworld\033[0m and bla bla bla!!!\n"。当程序使用prinf输出该字符串时,“world”一词是蓝色的。但是当我将 ncurses 接口与 wprintw 或 addch 一起使用时,我看到带有转义序列的原始字符串。这是否意味着 printf 是否处理转义序列?使用 ncurses 处理转义序列的最佳方法是什么?

c printf ncurses ansi-escape

3
推荐指数
1
解决办法
1978
查看次数

printf/scanf 的输入/输出替代方案

听起来可能很奇怪,我对 iOS 有很多了解,并且在 .net 方面有一些经验,但我是 C 的新手。在某个地方,我得到了这个目标,即在不使用 和 的情况下找到 n 个数字的printf平均值scanf。我不想要该程序的代码,但我正在寻找上述功能的替代方案。

printf/scanf这里需要代码吗?如果我的查询无效,也请告诉我。

c printf scanf

3
推荐指数
1
解决办法
1万
查看次数

ocaml printf 函数:如果某些条件成立,则完全跳过格式化

(摘自ocaml:在对象的方法中公开 printf 函数,因此可以独立回答)

我有以下(简化的)ocaml 代码,用于记录器:

type log_level =
    | Error
    | Warn
    | Info

let ord lvl =
    match lvl with
    | Error -> 50
    | Warn  -> 40
    | Info  -> 30

let current_level = ref (ord Warn)

let logf name lvl =
    let do_log str =
        if (ord lvl) >= !current_level then
            print_endline str
    in
    Printf.ksprintf do_log
Run Code Online (Sandbox Code Playgroud)

logf 函数可以与 printf 格式一起使用,如下所示:

logf "func" Warn "testing with string: %s and int: %d" "str" 42;
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以实现仅在实际需要时格式化参数的典型日志记录行为?即类似:

let …
Run Code Online (Sandbox Code Playgroud)

printf ocaml

3
推荐指数
1
解决办法
646
查看次数

使用 R 中的 sprintf 将前导零添加到数据框列

我有一个数据框,希望数字变量的长度为四位数字,为了做到这一点,我需要添加 1-3 个前导零,我选择执行此操作的方法是 sprintf 函数,因为数字并不重要转换为字符类。不幸的是结果没有按照我想要的顺序出现

测试数据帧的制作如下,并将前导 0 列添加为第三列,以便于比较。通过运行代码可以看出,粘贴前导零数字的顺序与原始数字顺序不符

test <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test[,3]<-sprintf("%04d", test[,2])
Run Code Online (Sandbox Code Playgroud)

通过将原始数字列分类为字符,按字母顺序重新排列数据帧顺序,sprintf 数字现在按升序排列,尽管数字系列不是。

test.two <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test.two <- test.two[i <-order(as.character(test.two[,2])),]
test.two[,3]<-sprintf("%04d", test.two[,2])
Run Code Online (Sandbox Code Playgroud)

我可以通过弗兰肯斯坦将其组合在一起来创建所需的数据集。

test.three <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test.three[,3]<-test.two[,3]
Run Code Online (Sandbox Code Playgroud)

然而,我想知道我做错了什么,以及什么方法可以给我带来我期望从我认为简单的操作中得到的结果!

printf r number-formatting dataframe leading-zero

3
推荐指数
1
解决办法
2202
查看次数

使用 shell 脚本将零填充到二进制数

如何使用 shell 脚本将零填充为二进制数。

二进制.txt

1010011100010001010111001101111
0
10110000000101000000000000001
10100000011
1000000100
1111111111111111
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
11111111111111110000000000000000
Run Code Online (Sandbox Code Playgroud)

当我执行以下操作时

printf "%032s\n" $(<binary.txt)
Run Code Online (Sandbox Code Playgroud)

我得到一个空白。

  1010011100010001010111001101111
                                0
    10110000000101000000000000001
                      10100000011
                       1000000100
                 1111111111111111
 11111111111111110000000000000000
 11111111111111110000000000000000
 11111111111111110000000000000000
Run Code Online (Sandbox Code Playgroud)

但我需要附加零。任何意见都会受到赞赏。谢谢,

更新:

binary.txt 是我的输入文件,具有以下内容。

1010011100010001010111001101111
0
10110000000101000000000000001
10100000011
1000000100
1111111111111111
11111111111111110000000000000000
11111111111111110000000000000000
Run Code Online (Sandbox Code Playgroud)

在命令行中运行以下命令时,它工作正常。

   printf "%032s\n" $(<binary.txt) | tr ' ' '0' >> t1.mif
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用下面的脚本执行相同操作时,它给了我错误的值。有什么建议。

#!/bin/bash
FILE=binary.txt
while read line;do
    printf "%032s\n" $line | tr ' ' '0' >> t1.mif
done < $FILE
Run Code Online (Sandbox Code Playgroud)

谢谢

binary bash shell scripting printf

3
推荐指数
1
解决办法
2405
查看次数

使用 printf 将零添加到整数值

我正在尝试使用该函数向用户输入的数字添加零printf()。但是,我不确定语法用法。这是我到目前为止所拥有的:

public class Solution {

    public static void main(String[] args) {
            Scanner reader = new Scanner(System.in);
            final int requiredNumLength = 3;
            // readign untill EOF
            while (reader.hasNext()){
                    // getting the word form the input as a string
                    String word = reader.next();
                    // getting the number from the input as an integer
                    int num = reader.nextInt();
                    int length = String.valueOf(num).length();
                            if (length < requiredNumLength){
                                    int zerosRequired = requiredNumLength - length;
                                    //System.out.println("required zeros: " + zerosRequired);
                            }
                    // print out …
Run Code Online (Sandbox Code Playgroud)

java printf append

3
推荐指数
1
解决办法
5734
查看次数

在执行 scanf 之前 printf 如何被刷新?

我最近阅读了很多关于标准输出缓冲的内容。我知道它printf是缓冲的,但到目前为止我认为它的缓冲区只有在新行被读入缓冲区或被fflush(stdout)调用或调用的进程printf正常退出时才会被刷新。

我写了这个程序,它调用 printf 之前没有换行scanf。当我用谷歌搜索时,我发现很多人说他们不明白为什么在 printf 之前执行 scanf。由于我现在了解标准输出缓冲的概念,这对我来说很有意义。

但是,就我而言,缓冲区在我运行 scanf 之前被刷新。这样做确实有意义,因为用户可能希望在任何 scanf 之前执行 printf,但它是如何发生的?究竟什么是刷新标准输出?是scanf吗?

int main(void) {
    char things;
    printf("Hello ");
    scanf("%c", &things);
}
Run Code Online (Sandbox Code Playgroud)

(我正在运行 Arch Linux)

编辑:由于一些评论说我的系统的标准输出是无缓冲的,我只想添加它而不scanf在我的程序上运行,我的程序完全具有我上面提到的行为,它肯定是缓冲的。

c linux printf scanf buffering

3
推荐指数
1
解决办法
94
查看次数

如何避免在 Bash `printf` 中使用空数组打印任何内容?

我经常使用这样的快捷方式打印出数组的内容printf:

$ printf "%s\n" "${my_array[@]}"
$ printf "%s\0" "${my_array[@]}"
Run Code Online (Sandbox Code Playgroud)

这在一般情况下效果很好:

$ my_array=(limburger stilton wensleydale)
$ printf "%s\n" "${my_array[@]}"
limburger
stilton
wensleydale
$
Run Code Online (Sandbox Code Playgroud)

效果很好,但是当数组为空时,它仍然输出单个字符(换行符或空字节):

$ my_array=()
$ printf "%s\n" "${my_array[@]}"

$
Run Code Online (Sandbox Code Playgroud)

当然,我可以通过首先测试一个空数组来避免这种情况:

$ [[ ${#my_array[@]} -gt 0 ]] && printf "%s\n" "${my_array[@]}"
$ (( ${#my_array[@]} )) && printf "%s\n" "${my_array[@]}"
Run Code Online (Sandbox Code Playgroud)

但是我一直在使用这个习语,并且希望它尽可能短。有没有更好(更短)的解决方案,也许是不同的printf格式,它根本不会用空数组打印任何内容?

arrays bash printf

3
推荐指数
1
解决办法
75
查看次数

如何在 C 中定义一个接受格式化输入字符串的函数?

我构建了一个自定义日志记录函数,它接收“日志级别”和字符串。用户将指定与消息关联的日志级别(即错误、警告、跟踪等)。日志功能只会根据当前配置的日志级别将消息打印到控制台。

int global_log_level = INFO;

void logger(int msg_log_level, char * msg)
{
    if(msg_log_level >= global_log_level )
    {
        printf("Log Level = %u: %s", msg_log_level, msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想将格式化的字符串提供给这个函数。

logger(LOG_LEVEL_ERROR, "Error of %u occurred\n", error_code);
Run Code Online (Sandbox Code Playgroud)

但是,通过添加此“包装”逻辑,我无法输入格式化的消息。相反,我必须将消息写入一个临时字符串,然后将其输入到函数中。

char temp[512];
sprintf("Error of %u occurred\n", error_code);
logger(LOG_LEVEL_ERROR, temp);
Run Code Online (Sandbox Code Playgroud)

有没有办法实现记录器功能,这样我就不需要让用户自己创建一个临时字符串?

c printf formatted-input

3
推荐指数
1
解决办法
58
查看次数