我想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) 为什么以下代码有效?
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函数中使用这个巨大的字符串格式化器宽度子说明符; 接近标准的限制一个正面签名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不会打印)第二个指针打印其余字符串.但是如果在字符串的其余部分中有另一种格式,则它会停在那里.
运行以下程序显示-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?
我想在Windows上为UNIX生成一个文件(脚本).所以我需要只输出LF字符,而不输出CR字符.
当我这样做时fprintf(fpout, "some text\n");,字符\n会自动替换\r\n为文件.
有没有办法输出特定的just \n(LF)字符?
语言是C++,但I/O函数来自C.
我有两个宏:
#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)
我想改变的是
所以最后我的输出只能有一个宏.
我试图了解附加到__VA_ARGS__是否有用,但我承认我不明白它是否与我的情况有关:(
谢谢.
我不小心写道:
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...我找不到重复或其他东西,因此问题.
使用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.但两者的大小保持不变
在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) 请考虑以下代码:
#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有关?