标签: printf

有没有办法确定sprintf将写入多少个字符?

我在C++工作.

我想用sprintf编写一个可能很长的格式化字符串(特别是像_snprintf_s这样的安全计数版本,但想法是一样的).在编译时大致的长度是未知的,所以我将不得不使用一些动态分配的内存而不是依赖一个大的静态缓冲区.有没有办法确定特定sprintf调用需要多少个字符,所以我总能确定我有足够大的缓冲区?

我的后备是我只需要格式字符串的长度,加倍它,并尝试.如果它工作,很好,如果不是,我只会加倍缓冲区的大小,然后再试一次.重复直到它适合.不完全是最聪明的解决方案.

看起来C99支持将NULL传递给snprintf来获取长度.我想我可以创建一个模块来包装该功能,如果没有别的,但我对这个想法不是很疯狂.

也许对"/ dev/null"/"nul"的fprintf可能会起作用吗?还有其他想法吗?

编辑:或者,是否有任何方法可以"spunk"sprintf所以它在中间写入?如果可能的话,它可以填充缓冲区,处理它,然后从它停止的地方开始重新填充.

c++ string printf

12
推荐指数
3
解决办法
4820
查看次数

PHP sprintf与echo

我今晚早些时候发布了一个问题 - PHP Wordpress引用了一些引用问题引起我一些问题的问题.

发布了一个答案建议使用echo sprintf.这看起来很干净,并处理可能发生的任何变量和引用问题.我的问题是,使用sprintf的缺点是什么?如果有的话?

echo如果它经常导致混合HTML和PHP的问题,我们为什么要使用它们.作为参考,这是回应的声明:

echo "<img src='"; bloginfo('template_url'); echo "img/" . $f['mainImage'] . ".png' />";

和echo&sprintf:

echo sprintf(
    '<img src="%s/img/%s.png" />', 
    get_bloginfo('template_url'), 
    $f['mainImage']
);
Run Code Online (Sandbox Code Playgroud)

php printf echo

12
推荐指数
1
解决办法
7409
查看次数

你能把矢量传递给vararg吗?:向sprintf传递

假设我有一个带变量参数的函数,比如sprintf().我想要的东西:

sprintf("%s %s", "a", "b")
Run Code Online (Sandbox Code Playgroud)

但我在矢量c("a","b")中有"a"和"b".像这样的电话

sprintf("%s %s", c("a", "b"))
Run Code Online (Sandbox Code Playgroud)

会因为参数不足而产生错误.许多语言提供了一种将矢量"展平"为可变长度参数的方法.但我似乎无法在R中找到这样做的语法.有办法吗?

printf r vector

12
推荐指数
1
解决办法
1877
查看次数

将varargs传递给printf

我想要一个辅助函数log,基本上执行以下操作:

log(file, "array has %d elements\n", 10);
// writes "2014-02-03 16:33:00 - array has 10 elements" to &file
Run Code Online (Sandbox Code Playgroud)

我有时间部分,我有文件写入部分.然而,问题是方法签名本身log- 我应该放什么?这表示printf声明以...关键字结束,但我如何在我的函数中使用它?

void log(FILE *f, const char * format, ...) // how would I pass ... to fprintf?
Run Code Online (Sandbox Code Playgroud)

让我编辑这个包含更多信息.

我有一个const char * now ()返回"2014-02-03 16:33:00"形式的字符串.我想像这样传递另一个格式字符串.这两个陈述应该是等同的:

log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);
Run Code Online (Sandbox Code Playgroud)

我知道这vfprintf可以让我通过va_list,但我怎么能把它now() …

c printf function variadic-functions

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

当std :: fprintf(stderr,...)失败时,操作是否无效或者在失败之前可以写一点?

我有一个C++ 11程序,用于std::fprintf写入stderr日志和调试信息.我知道fprintf可以失败并返回负值,但我无法找到操作是否为原子(如果失败,没有效果),或者它可以写入文本的某些部分然后失败(或任何其他副作用).

使用的函数fprintf如下所示:

void writeToConsole (std::string const &message)
{
    std::fprintf(stderr, "%s\n", message.c_str());
}
Run Code Online (Sandbox Code Playgroud)

我正在Linux上开发使用Clang和GCC(现在),但我的问题更多是关于标准,所以......

题:

如果std::fprintf失败,仍有可能写入某些字符stderr?此行为是C/C++标准还是实现定义的?

更重要的是,如果std::fprintf失败,我应该中止该程序还是可以在没有副作用的情况下静默执行(除了不可能写入stderr)?

c++ printf c++11

12
推荐指数
2
解决办法
484
查看次数

printf从char数组中添加额外的`FFFFFF`到十六进制打印

请考虑以下简化代码.我想从文件中提取一些二进制数据/流,并以十六进制格式将其打印到标准输出.

我有额外的3个字节0xFFFFFF.怎么了?额外的字节来自哪里?

产量

in:
        2000FFFFFFAF00690033005A00
out:
        2000FFFFFFAF00690033005A00
Run Code Online (Sandbox Code Playgroud)

program.c

#include <stdio.h>
#include <stdlib.h>    

int main(int argc, char** argv) {

    int i;
    char raw[10] = {0x20,0x00,0xAF,0x00,0x69,0x00,0x33,0x00,0x5A,0x00};
    FILE *outfile;
    char *buf;

    printf("in:\n\t");
    for( i=0; i<10; i++ )
        printf("%02X", raw[i]);

    outfile = fopen("raw_data.bin", "w+b");

    fwrite(raw, 1, 10, outfile);

    buf = (char *) malloc (32 * sizeof(char));
    fseek(outfile, 0, SEEK_SET);
    fread(buf, 1, 10, outfile);

    printf("\nout:\n\t");
    for( i=0; i<10; i++ )
        printf("%02X", buf[i]);

    printf("\n");

    fclose(outfile);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c arrays printf

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

打印%d时printf的行为而不提供变量名称

我刚刚遇到一个奇怪的问题,我正在尝试printf一个整数变量,但是我忘了指定变量名,即

printf("%d");
Run Code Online (Sandbox Code Playgroud)

代替

printf("%d", integerName);
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是程序编译,有输出,它不是随机的.事实上,它恰好是我想要首先打印的整数,恰好是m-1.

printf只要程序继续运行,错误语句就会一直输出m-1 ...换句话说,它的行为就像语句读取一样

printf("%d", m-1);
Run Code Online (Sandbox Code Playgroud)

谁知道这种行为背后的原因?我在没有任何命令行选项的情况下使用g ++.

#include <iostream>
#define maxN 100
#define ON 1
#define OFF 0

using namespace std;

void clearArray(int* array, int n);
int fillArray(int* array, int m, int n);

int main()
{
    int n = -1, i, m;
    int array[maxN];
    int found;

    scanf("%d", &n);

    while(n!=0)
    {
        found=0;
        m = 1;
        while(found!=1)
        {
            if(m != 2 && m != 3 && m != 4 && m != 6 && m != …
Run Code Online (Sandbox Code Playgroud)

c printf

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

Clojure sprintf?

有printf.它直接打印到stdout.

sprintf怎么样,格式与printf相同,但返回一个没有副作用的字符串?

printf clojure

11
推荐指数
3
解决办法
2596
查看次数

Bash:"printf%q $ str"在脚本中删除空格.(备择方案?)

printf%q应该引用一个字符串.但是,当执行到脚本中时,它会删除空格.

这个命令:

printf %q "hello world"
Run Code Online (Sandbox Code Playgroud)

输出:

hello\ world
Run Code Online (Sandbox Code Playgroud)

哪个是对的.

这个脚本:

#!/bin/bash

str="hello world"
printf %q $str
Run Code Online (Sandbox Code Playgroud)

输出:

helloworld
Run Code Online (Sandbox Code Playgroud)

这是错的.

如果确实需要这样的行为,那么脚本中有什么替代方法可以引用包含任何字符的字符串,以便可以通过被调用的程序将其转换回原始字符?

谢谢.

软件:GNU bash,版本4.1.5(1)-release(i486-pc-linux-gnu)

编辑:解决了,谢谢.

bash printf

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

打印unsigned long long int值类型返回奇怪的结果

我在使用printf函数打印类型值时遇到问题unsigned long long int

我不知道出了什么问题.我在Windows 7 Professional 64位上使用Dev-Cpp 4.9.9.2和Visual Studio 2010 Professional(我知道它不是C编译器,但无论如何,想要尝试).为了显示,我使用了%llu修饰符(根据你如何printf一个unsigned long long int(unsigned long long int的格式说明符)?)但是我也尝试了I64d没有效果......


首先,我只是想打印的最小值和最大值unsigned long long int(使用ULONG_MAX来自limits.h)

printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);
Run Code Online (Sandbox Code Playgroud)

返回:

unsigned long long int:18446744069414584320 to 1580552164021 (Dev-Cpp)

unsigned long long int:18446744069414584320 to 0 (Visual Studio)


然后我尝试使用printf打印两个零

printf("unsigned long long int: \n%llu to %llu \n\n", 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回:

unsigned long long int:0到1580552164021 (Dev-Cpp) …

c syntax printf unsigned-long-long-int

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