我试图在 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) 我的程序从网络读取一些文本数据,例如:
Hello \033[1;34mworld\033[0m and bla bla bla!!!\n"。当程序使用prinf输出该字符串时,“world”一词是蓝色的。但是当我将 ncurses 接口与 wprintw 或 addch 一起使用时,我看到带有转义序列的原始字符串。这是否意味着 printf 是否处理转义序列?使用 ncurses 处理转义序列的最佳方法是什么?
听起来可能很奇怪,我对 iOS 有很多了解,并且在 .net 方面有一些经验,但我是 C 的新手。在某个地方,我得到了这个目标,即在不使用 和 的情况下找到 n 个数字的printf平均值scanf。我不想要该程序的代码,但我正在寻找上述功能的替代方案。
printf/scanf这里需要代码吗?如果我的查询无效,也请告诉我。
(摘自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) 我有一个数据框,希望数字变量的长度为四位数字,为了做到这一点,我需要添加 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)
然而,我想知道我做错了什么,以及什么方法可以给我带来我期望从我认为简单的操作中得到的结果!
如何使用 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)
谢谢
我正在尝试使用该函数向用户输入的数字添加零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) 我最近阅读了很多关于标准输出缓冲的内容。我知道它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在我的程序上运行,我的程序完全具有我上面提到的行为,它肯定是缓冲的。
我经常使用这样的快捷方式打印出数组的内容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格式,它根本不会用空数组打印任何内容?
我构建了一个自定义日志记录函数,它接收“日志级别”和字符串。用户将指定与消息关联的日志级别(即错误、警告、跟踪等)。日志功能只会根据当前配置的日志级别将消息打印到控制台。
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)
有没有办法实现记录器功能,这样我就不需要让用户自己创建一个临时字符串?