我尝试使用C中的scanf()读入2个值,但系统写入内存的值不等于我输入的值.这是代码:
double a,b;
printf("--------\n"); //seperate lines
scanf("%ld",&a);
printf("--------\n");
scanf("%ld",&b);
printf("%d %d",a,b);
Run Code Online (Sandbox Code Playgroud)
如果我输入1和2,CMD返回正确的,但是b = -858993460这是我已经尝试的:使用float或int而不是double,使用scanf_s,使用scanf("%d或%f用于%i或%li或%lf或%e或%g),使用fflush(stdin)清除键盘缓冲区,首先读入b,尝试所有可能的组合.我发现32位操作系统上的双倍长度存在问题,这样你就不得不使用scanf("%lf",&f)读取一个double.无论我做什么,第二个值总是错误的.
我在Windows 7 32位操作系统上使用MS VS express 2012 for Desktop.
根据C11章节§7.21.6.1,P9
如果转换规范无效,则行为未定义.282)如果任何参数不是相应转换规范的正确类型,则行为未定义.
到时候,我的理解是,为
char str [] = "Sourav";
Run Code Online (Sandbox Code Playgroud)
printf("%S", str);属于第一句话,没有CS作为%S(UPPERCASE)printf("%d", str);属于第二句(CS和参数类型不匹配,但是%d是不是 "无效" CS,反正)我的理解错了吗?第二个语句是否也可以归类为"无效"(PS-而非"错误")转换说明符?
#include<stdio.h>
int main()
{
int i = 577;
printf("%c",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译后,它给出输出“A”。谁能解释一下我是如何得到这个的?
表达这个问题的另一种方式可能是“如何在 printf 中结束格式说明符”
如果我想100us使用以下代码以这种格式打印微秒......
long microseconds = 100L;
printf("%lus", microseconds);
Run Code Online (Sandbox Code Playgroud)
只打印,100s因为 theu与 the 组合%l,并且它将格式说明符解释为 anunsigned long而不是 along
c printf format-specifiers conversion-specifier length-modifiers
请考虑以下代码:
#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的某处看到了一部分代码
char name[51];
int group = 0;
scanf("%*s %50s %*s %d", name, &group);
printf("%s / %d\n", name, group);
Run Code Online (Sandbox Code Playgroud)
如果我们介绍
“名称:史密斯集团:7”
它等待着我们引入另一个价值。真奇怪。到底发生了什么,%*s %50s %*s意味着什么。我%*s以前看过,但从未看过字符串。
char *ptr = malloc(sizeof(char));
printf("\nValue of ptr: %d\n",ptr);
printf("\nValue of address of ptr: %x\n",&ptr);
printf("\nValue of pointed by ptr: %c\n",*ptr);
printf("\nValue of address pointed by ptr: %x\n",&(*ptr));
*ptr='u';
printf("\nValue of pointed by ptr: %c\n",*ptr);
printf("\nValue of address pointed by ptr: %x\n",&(*ptr));
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,收到以下输出:
Value of ptr: 1046113600
Value of address of ptr: a2fffa78
Value of pointed by ptr: P
Value of address pointed by ptr: 3e5a6d40
Value of pointed by ptr: u
Value of address pointed by ptr: 3e5a6d40
Run Code Online (Sandbox Code Playgroud)
这是否意味着具有单个字符大小的malloc的默认值为P?
尝试使用 …
使用 int 进行 float 隐式转换时,失败并显示 printf()
#include <stdio.h>
int main(int argc, char **argv) {
float s = 10.0;
printf("%f %f %f %f\n", s, 0, s, 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用它编译时gcc -g scale.c -o scale会输出垃圾
./scale
10.000000 10.000000 10.000000 -5486124068793688683255936251187209270074392635932332070112001988456197381759672947165175699536362793613284725337872111744958183862744647903224103718245670299614498700710006264535590197791934024641512541262359795191593953928908168990292758500391456212260452596575509589842140073806143686060649302051520512.000000
Run Code Online (Sandbox Code Playgroud)
如果我显式地将整数转换为浮点数,或者使用 a 0.0(这是 a double),它会按设计工作。
#include <stdio.h>
int main(int argc, char **argv) {
float s = 10.0;
printf("%f %f %f %f\n", s, 0.0, s, 0.0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当用它编译时gcc -g scale.c -o scale确实输出预期的输出
./scale
10.000000 …Run Code Online (Sandbox Code Playgroud) c printf type-conversion implicit-conversion conversion-specifier
在 w3resource.com 上的一篇文章中,我看到了以下代码:
double x, y;
pr1 = sqrt(pr1);
x = (-b + pr1)/(2*a);
y = (-b - pr1)/(2*a);
printf("Root1 = %.5lf\n", x);
printf("Root1 = %.5lf\n", y);
Run Code Online (Sandbox Code Playgroud)
文章说取三个浮点数。但在他们的解决方案(此代码片段)中,他们使用了%lf格式说明符。他们为什么使用%lf而不是%f?我也可以使用%f代替%lf浮点数吗?
如果我使用float关键字代替double, 并使用%f, 有什么问题吗?输出对我来说是一样的。
#include<stdio.h>
int main(){
int a = 3;
printf("%u\n",&a);
printf("%d\n",&a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试图打印变量“a”的地址。现在使用两个不同的格式说明符“%u”和“%d”,打印两个不同的内存地址,我觉得很奇怪。
所以我的问题是两个格式说明符之间有什么区别?