Tag: printf

printf参数不足

我的问题是关于缺少参数的printf之后的行为: printf(“%s blah blah %d”, int); // integer was given as argument (and not int written) 我已经知道如果格式的参数不足,则行为未定义。 问题是printf结果或整个程序是否未定义? 当%s试图从未经授权的内存地址读取时,可能会发生崩溃。 (它发生在我身上) printf完成后会发生崩溃吗? (打印一些垃圾字符串和整数) 编辑: 澄清我不是在询问编译错误或警告,执行此行时程序也不会崩溃。 问题是这行可以使程序在此行已经执行后随机崩溃。

printf浮点数的可变小数位数

我找到了有趣的格式来打印非终止的固定长度字符串,如下所示: char newstr[40] = {0}; sprintf(newstr,”%.*s”, sizeof(mystr), mystr); 所以我想也许在printf命令下有一种打印浮点数的方法…… “%8.2f” 能够选择整数的小数位数。 像这样的东西: sprintf(mystr, “%d %f”, numberofdecimals, floatnumbervalue) 编辑 – 解决方案: (用于将浮点数舍入和清除到所需精度)。 int precision = 2; char kolf[16] = {0}; sprintf(kolf, “%8.*f”, precision, mystruct.myfloat); float kol = atof(kolf);

传入_Generic宏的不兼容的指针类型

以下代码生成2个警告,这些警告在问题标题中描述。 #include static void _print_f(float *f){printf(“float : %f\n”, *f);} static void _print_i(int *i) {printf(“int : %d\n”, *i);} #define print(num) _Generic((num), \ int* : _print_i(num), \ float* : _print_f(num)) int main(void) { print((&(int){10})); print((&(float){10.f})); return 0; } OUTPUT: int : 10 float : 10.000000 我知道,这个宏可以写成如下: #define print(num) _Generic((num), \ int* : _print_i, \ float* : _print_f)(num) […]

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

我刚刚遇到一个奇怪的问题,我正在尝试printf一个整数变量,但是我忘了指定变量名,即 printf(“%d”); 代替 printf(“%d”, integerName); 令人惊讶的是程序编译,有输出,它不是随机的。 事实上,它恰好是我想要首先打印的整数,恰好是m-1。 只要程序一直运行,错误的printf语句将始终输出m-1 …换句话说,它的行为就像语句读取一样 printf(“%d”, m-1); 谁知道这种行为背后的原因? 我在没有任何命令行选项的情况下使用g ++。 #include #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) […]

在C中打印字符及其ASCII码

如何在C中打印char及其等效的ASCII值?

为什么printf圆形浮点数?

我试图使用printf打印一些浮点数。 例如: int main() { printf(“%.1f”,76.75); return 0; } 输出:76.8 我对结果有一些疑问。 首先,为什么不打印76.7? 第二,它是如何围绕这个数字的呢?

为什么scanf不需要字符串的&符号,也适用于printf(在C中)?

我现在正在学习C中的字符串。 如何使用scanf获取你可以做的字符串 scanf(“%s”,str1); 而对于printf你可以做到 printf(“The string is %s\n”, str1); 我理解,对于scanf来说,这是因为字符串只是一个字符数组,它是一个指针,但是对于printf,你怎么能像输入int或float一样放置变量名?

使用printf 在c中的fork()

有2个不同的程序,它们很小,例如: int main() { printf (“print hello”); fork(); } int main() { printf (“print hello\n”); fork(); } 输出1是:`print helloprint hello 输出2是: print hello 问题是,为什么带有\n那个只打印一次,而第一个打印两次?

如何在C中打印内存地址

我的代码是: #include #include void main() { char string[10]; int A = -73; unsigned int B = 31337; strcpy(string, “sample”); // printing with different formats printf(“[A] Dec: %d, Hex: %x, Unsigned: %u\n”, A,A,A); printf(“[B] Dec: %d, Hex: %x, Unsigned: %u\n”, B,B,B); printf(“[field width on B] 3: ‘%3u’, 10: ‘%10u’, ‘%08u’\n”, B,B,B); // Example of unary address […]

printf(“%p”)并转换为(void *)

在最近的一个问题中,有人提到当使用printf打印指针值时,调用者必须将指针强制转换为void *,如下所示: int *my_ptr = …. printf(“My pointer is: %p”, (void *)my_ptr); 对于我的生活,我无法弄清楚为什么。 我发现了这个问题 ,几乎是一样的。 问题的答案是正确的 – 它解释了整数和指针的长度不一定相同。 当然,这是正确的,但是当我已经有一个指针时,就像上面的情况一样,我为什么要从int *为void * ? 什么时候int *与void *不同? 事实上,什么时候(void *)my_ptr生成的任何机器代码都与my_ptr不同? 更新:多个知识渊博的响应者引用了标准,说传递错误的类型可能会导致未定义的行为。 怎么样? 我希望printf(“%p”, (int *)ptr)和printf(“%p”, (void *)ptr)生成完全相同的堆栈帧。 两个调用何时生成不同的堆栈帧?