标签: printf

在向量中使用sprintf而不是向量,而不是使用可变数量的参数

我想sprintf在R中使用带有可变数量参数的函数。是否可以将这些参数捆绑在一起形成字符向量或列表,以避免sprintf单独提供这些参数?

一个例子将阐明:

base_string = "(1) %s, (2) %s, (3) %s"
sprintf(base_string, "foo", "bar", "baz") # this works
sprintf(base_string, c("foo", "bar", "baz")) # this doesn't work
Run Code Online (Sandbox Code Playgroud)

在Python中,我可以使用

base_string = "(1) %s, (2) %s, (3) %s"
base_string % ("foo", "bar", "baz")
Run Code Online (Sandbox Code Playgroud)

printf r

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

为什么在printf中指定为整数的char被正确打印

为什么以下代码有效?

char c = 'A';
printf("%d - size: %d", c, sizeof(c));
Run Code Online (Sandbox Code Playgroud)

打印出来:

65 - size: 1
Run Code Online (Sandbox Code Playgroud)

为什么输出不是垃圾,因为int通常是4个字节长,我们可以清楚地看到char是1个字节长.编译器是否进行隐式对话?

c printf types stdio type-conversion

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

printf中可打印的最大字符数

在C的printf函数中使用这个巨大的字符串格式化器宽度子说明符; 接近标准的限制一个正面签名int; 在其余字符串格式下面提供的内容将被忽略.

示例字符串格式:

printf("**%2147483614p %1073739618p This text and %d formatters are ignored!!! why**", &i, &j, 10);
Run Code Online (Sandbox Code Playgroud)

输出:**2147483614 empty spaces0xbf******1073739618 empty spaces

问题:

文本"**此文本和10格式化程序被忽略!!!为什么****"和整数10没有显示在屏幕上.它打印带有填充的第一个%p和第二个%p的宽度说明符创建的填充,但没有指针和要打印的字符串的其余部分.

注意:可以通过左调整格式说明符来使第二个指针打印出来

printf("%-2147483614p%-1073739618p此文本和%d格式化程序被忽略!!!为什么**",&i,&j,10);**

但仍然缺少后面的字符串.

代码

#include <stdio.h>

int main(int argc, char const *argv[]){
    printf(argv[1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

x86_64-linux-gnu gcc 7.3.0版

gcc printf.c -o printf

./printf"%-2147483614p%-1073739618p 此文本和%d格式化程序被忽略!!!为什么 "

PS我知道这是一个内存泄漏


找到%29p(29是最大值,30不会打印)第二个指针打印其余字符串.但是如果在字符串的其余部分中有另一种格式,则它会停在那里.

c string printf string-formatting

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

为什么是printf("%d",~a); 当a等于3时显示-4?

运行以下程序显示-4,而预期252:

unsigned char a=3;
printf ("%d", ~a);
Run Code Online (Sandbox Code Playgroud)

为什么这段代码不显示252?

我还根据提出的答案测试了下面的内容:

printf ("%u", ~a);
Run Code Online (Sandbox Code Playgroud)

显示:4294967292

printf ("%hu", ~a);
Run Code Online (Sandbox Code Playgroud)

显示:65532

为什么~a不返回unsigned char,因为一个是一个unsigned char?

我的问题不是我应该怎么做才能显示252?我的问题是为什么没有显示252?

c printf unsigned char negation

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

C/C++打印自定义EOL

我想在Windows上为UNIX生成一个文件(脚本).所以我需要只输出LF字符,而不输出CR字符.

当我这样做时fprintf(fpout, "some text\n");,字符\n会自动替换\r\n为文件.

有没有办法输出特定的just \n(LF)字符?

语言是C++,但I/O函数来自C.

c c++ printf eol output

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

Variadic Macro调用fprintf:如何向__VA_ARGS__添加参数?

我有两个宏:

 #define LogFunction(str)       fprintf(stdout, "%s: %s\n",__FUNCTION__,(str))
 #define LogPrintf(f_, ...)     fprintf(stdout, (f_), ##__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

所以我可以这样使用它们:

void MyFunction()
{
    int N=4;
    LogFunction("START");      // Outputs "MyFunction: START"
    LogPrintf("N=%d\n", N);    // Outputs "N=4"
}
Run Code Online (Sandbox Code Playgroud)

我想改变的是

  1. 在LogPrintf的开头添加FUNCTION,就像在LogFunction中一样
  2. 在LogPrintf的末尾添加"\n",而不必记住把它放在我自己身上

所以最后我的输出只能有一个宏.

我试图了解附加到__VA_ARGS__是否有用,但我承认我不明白它是否与我的情况有关:(

谢谢.

c macros printf variadic-macros

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

$ d在printf中做了什么?

我不小心写道:

printf "here: %s $d\n" "${line:0:32}" "${#line}"
Run Code Online (Sandbox Code Playgroud)

得到了:

here: /home/gsamaras/Bash/libs/goodLib 
here: 103 
Run Code Online (Sandbox Code Playgroud)

为什么?

我当然想说%d,但我不理解我犯的错误中的这种行为.我可能希望它打印"here:/ home/gsamaras/Bash/libs/goodLib $ d",就像它do in C...我找不到重复或其他东西,因此问题.

string bash printf format-specifiers

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

sizeof(函数)总是返回1.为什么?

使用sizeof()的函数的大小始终返回1

我只是试图找到一个函数的大小.虽然使用sizeof()来查找它总是返回的大小1.即使函数是一个定义良好的函数它只返回1.我只想知道为什么它返回1.在说sizeof(功能)时它实际上考虑了什么.

考虑一个简单的交换功能.我用fun3来表示占用的地址差异.

void fun1(int a,int b)
{
 int temp;
 temp=a;
 a=i;
 i=b;
 printf("%d\t %d\n",a,b);
}
void fun2()
{

}
void fun3()
{

}
void main()
{
 printf("fun1\t Address : %d \t Size : %d\n",fun1,sizeof(fun1));
 printf("fun2\t Address : %d \t Size : %d\n",fun2,sizeof(fun2));
 printf("fun3\t Address : %d \t Size : %d\n",fun3,sizeof(fun3));
}
Run Code Online (Sandbox Code Playgroud)

这里的输出是
fun1地址:4199248大小:1
fun2地址:4199301大小:1
fun3地址:4199307文件大小:1

fun1占用的地址数量巨大,fun2仅占用6.但两者的大小保持不变

c printf function-pointers sizeof

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

将printf重定向到fopencookie

在Linux上(Raspberry Pi上的Raspbian)我想这样做,以便我的C应用程序打印使用的任何内容都会printf在回调中发回给我.

(不,我不是在谈论shell重定向> some_file.txt.我正在谈论一个C程序自己决定发送stdout(因此printf)在同一个程序中的回调.)

(是的,我确实想要这样做.我正在使用OpenGL制作全屏程序,并希望printf使用我自己的渲染代码在该程序中向用户呈现任何文本.printf用其他东西替换所有调用是不可行.)

我觉得这应该很容易.StackOverflow上已经存在这个问题的变体,但我找不到的都是完全一样的.

我可以fopencookie用来获得一个FILE*最终调用我的回调.到现在为止还挺好.挑战是去stdout和printf去那里.

我无法使用,freopen因为它需要一个字符串路径.在FILE*我想重定向到是不是文件系统中的文件,而只是在运行时存在.

我无法使用,dup2因为FILE*from fopencookie没有文件描述符(fileno返回-1).

在glibc的文件表明,我可以简单地重新分配stdout给我的新FILE*:"标准输入,标准输出,和stderr都是你可以设置就像任何其他正常的变数." .这几乎可以工作.任何印有fprintf (stdout, "whatever") 没有去我的回调,所以做任何printf有任何格式说明.但是,任何printf使用没有格式说明符的字符串的调用仍然会转到"原始"标准输出.

我怎样才能实现我想做的事情?

PS:我不关心便携性.这只会在我当前的环境中运行.

#define _GNU_SOURCE                                                         
#include <stdio.h>                                                          
#include <unistd.h>                                                         
#include <assert.h>                                                         
#include <stdarg.h>                                                         
#include …
Run Code Online (Sandbox Code Playgroud)

c printf glibc stdio raspbian

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

%PRId和%d格式字符有什么区别?

请考虑以下代码:

#include <stdio.h>
#include <inttypes.h>

void main(void)
{
    int32_t a = 44;

    fprintf(stdout, "%d\n", a);
    fprintf(stdout, "%"PRId32"\n", a);
}
Run Code Online (Sandbox Code Playgroud)

什么时候使用%d更好,"%"PRId32什么时候使用会更好?这两种格式字符有何不同?这是否与int32_t您的硬件/机器上的typedeffed有关?

c printf conversion-specifier length-modifiers

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