为什么我的函数会打印'0'?
这是我的代码,我不完全知道为什么会发生这种情况: #include void foo(float *); int main() { int i = 10, *p = &i; foo(&i); } void foo(float *p) { printf("%f\n", *p); } 输出: 0 解决方案 您正在调用带有int指针的float*的函数.在C ++中,这是一个错误,您的代码不会编译.在C中,无论如何,您很可能会得到警告和不确定的行为. 其他解决方案 已经说过,您正在将整数变量的地址作为单个精度浮点数的地址. 理想情况下,这种隐式转换应该不允许,但是根据编译器以及它是干净的C还是C ++,它可能只会导致警告. 但是它为什么要精确打印0? 这是因为单个精度fpn的方式为(1 bit of sign)|(8 bits of biased exponent)|(23 bits of sig
0 2024-04-10
编程技术问答社区
使用%f格式指定器打印int
我想知道为什么输出为0.000000. 我知道使用Float格式指定符或使用B类型的值类型的打印INT可以像许多位置书写一样指定的行为. 我引用它 "如果转换规范无效,则行为为 不明确的.如果任何参数不是正确的类型 相应的转换规范,行为是不确定的." 但它总是给出0.000000,必须在寄存器或汇编代码中定义某些定义. 简而言之 #include int main() { int i=10; printf("%f\n",i); return 0; } 所有人都说我知道我的价值可能是输出中的某个地方,但是由于进动窗口尺寸,它未在控制台上显示. 如果我使用%e,我会得到 解决方案 您一天可能会得到相同的结果,第二天的另一个结果,这就是 不确定的行为 .标准不能保证未定义行为的任​​何确定性结果. 使用printf 打印时,应使用适当的类型指定器 其他解决方案 未定义的行为并不意味着您必须在不同的运行中获得不
0 2024-04-10
编程技术问答社区
如果我的电脑是32位系统,它的地址是32位的,对吗?但是当我在C语言中打印任何内存地址时,为什么会得到一个<32位的地址?
例如 printf("%u",&a); 给我输出 65524 这是一个16位地址. 解决方案 因为您使用了错误的格式指定符,以调用要打印指针,您应该使用%p格式指定符,然后将参数投入到void*.像 printf("%p",(void *)&a); 将完成这项工作. 也就是说,您应该研究虚拟记忆的第一件事. 其他解决方案 您还可以通过检查任何指针的大小而不是测试变量的地址来回答有关地址大小的假设: printf("%zu\n", sizeof(int*)); printf("%zu\n", sizeof(float*)); 假设所有系统中的字节等于八位,您可以看到地址的大小. 请参阅此 P> 其他解决方案 找到(大多数)当前常见系统的最高地址: #include #include int main(void) { uintptr_t uip = (uintpt
0 2024-04-10
编程技术问答社区
在这段代码中,格式指定符"%02x "和"%3o "有什么作用?
在搜索K&R C练习声明的含义7-2 I Foun的含义时,练习要求 编写一个将以明智的方式打印任意输入的程序.至少,它应根据当地习俗打印八十二十一个或十六进制的非图形字符,并打破长文本线条. 我也无法理解练习的句子的含义,特别是"最低限度,它应该根据当地习惯以八十二核或十六进制打印非镜头字符". 这项练习7-2要求什么?请解释练习陈述的含义. 以下代码使用格式指定器"%02X"和"%3O"在代码末尾使用以打印非打印字符,但是此格式指定器对非打印机的究竟是什么? else { if(textrun > 0 || binaryrun + width >= split) { printf("\nBinary stream: "); textrun = 0; binaryrun = 15; } printf(format, ch); binaryr
0 2024-04-10
编程技术问答社区
int x; scanf()含%d and printf()带有%c
int x; 因此,该变量将有2个字节内存. 现在,如果我输入66,并且因为具有%d的scanf()将存储在2个字节内存中,因为变量已声明为int. 现在,在带有%c的printf()中,应仅从一个字节内存中收集数据以显示. 但通过从内存显示正确的数据66来正确显示b. 为什么%c不仅从一个字节中获取数据? 解决方案 %c 期望 an int参数,由于默认参数properions 的vararg函数.换句话说,以下所有内容都是完全等效的: int x = 66; char y = 66; printf("%c", x); // A printf("%c", (char)x); // B printf("%c", y); // C printf("%c", (int)y); // D 因此,正在发生的一切都是printf将66的int值解释为ASCII代码 1 并打印相应的字符. 1.请注意,从技术上讲,A
2 2024-04-10
编程技术问答社区
用scanf()格式指定器验证一个电子邮件地址
这可能有点像一个"修复我的代码"问题,但是我已经看了 documentation ,示例-address-in-c-sharp">数十个, ,相关,或多或少地了解所有操作的工作原理,我在将其转换为C sscanf()格式代码方面遇到了麻烦.我仍然是C的新事物,并且刚刚开始陷入略微简化的内容,并且我很难找出更复杂的格式指定符(即.%[^...]等). . 无论如何,这就是我所拥有的: char user[EMAIL_LEN]; char site[EMAIL_LEN]; char domain[4]; if(sscanf(input, "%s@%s.%3s", user, site, domain) != 3){ printf("--ERROR: Invalid email address.--\n"); } 为什么不起作用?我只是想获得一种简单的aaaa@bbbb.ccc格式,但由于某种原因sscanf(input, "%s@%s.%3s", user, site, d
4 2024-04-09
编程技术问答社区
为什么在printf中缺少参数不会产生错误?
在以下代码中 - int main() { // your code goes here int a=10,b=20,c=30; printf("%d %d %d\n",a,b,c); printf("%d %d %d %d %d %d\n",a,b,c); return 0; } 输出在其各自的位置中包含10,20和30,但剩余的%d格式指定器输出垃圾值.如果我们不指定所需的参数数量,为什么不给错误?这有时有用吗? 代码链接: indeone 解决方案 是 nonofollow"> undsem> undsected 如果您通过的参数要比更少格式指定符.编译器不需要在不确定的行为上产生任何错误. ,尽管大多数编译器都会做.例如,GCC为您的代码生成以下内容: warning: too few arguments for format 编译时: gcc -Wall -Wextra -std=c99 fi
0 2024-04-09
编程技术问答社区
在printf语句中,fomat指定符的数量能否少于变量的数量?
我已经在Borland C编译器中编码了以下程序.我的疑问是为什么C编译器没有在编译时间或运行时间中丢弃任何错误.程序执行罚款,输出为2 4. #include #include int main(){ int a=2,b=4,c=6; printf("%d%d",a,b,c); getch(); return 0; } 即使格式指定少于参数的数量少,没有错误的错误. 解决方案 比printf语句中的变量数量 中的fomat指定符数 答案是肯定的.从C标准: (c99,7.19.6.1p2)"如果在保留参数的同时耗尽了格式,则评估了多余的论点(一如既往),但被忽略了." 其他解决方案 可以正常工作,但是如果您的编译器设置为检查printf varargs参数. ,可能会出现编译器错误. printf函数是variadic,即采用可变数量的参数.格式字符串将决定使用多少,如果您指定太多,它们将被忽略.
0 2024-04-09
编程技术问答社区
Scanf函数在寻找%d匹配时是否会忽略回车键?
我是C语言的新手,我正在Kim N. King的一本书上研究它.它说scanf()正在寻找忽略车形的数字模式,但我认为它也跳过Enter键.虽然它寻找字符,但显然也需要whitepace. 因此,在此示例代码中,我必须使用getchar()在第二个scanf()之前清除流,否则第二个将在不等待用户输入的情况下执行第二个流. printf("Enter a char: "); scanf("%c", &ch1); getchar(); printf("\nEnter another char: "); scanf("%c", &ch2); 如果我寻找数字,我没有问题. printf("Enter a number: "); scanf("%d", &n1); printf("\nEnter another number: "); scanf("%d", &n2); 我的假设(它跳过Enter键)对吗? 解决方案 按 enter 键输入a newline(\
0 2024-04-09
编程技术问答社区
如何使MINGW GCC识别size_t的%ZU格式指定符?
图像值得一千个字: 我知道如何解决问题问题.但是如何在Microsoft 中修复它,以免警告? 编辑: 与其他人在委托中指出的内容相反,这是特定于 Microsoft 系统的.我可以在Linux计算机上运行完全相同的代码,在具有相同配置的VSCODE(tasks.json and Properties.json)中使用相同版本的GCC中的VSCODE,使用它,我不会收到这些编译器警告. 我正在使用的C标准是C17. 尝试使用格式依赖性函数(例如printf和scanf)中的"%z"(甚至是"%ll")之类的格式指定器将触发格式编译器警告,即使在完全更新(截至08/2021)中Windows 10 OS,带有最新的MINGW -64工具链(特别是GCC 8.1.0-这是此处使用的编译器). 图像中显示的"编译器错误"实际上只是一种格式警告被视为错误(引用编​​译器:" [-werror = format =]") 谢谢,"@the Busybee".您试图解决这个
10 2024-04-09
编程技术问答社区
关于C语言中的printf格式字符串
让我们采用以下程序: #include int main() { long t =57 ; printf("[%+03ld]", t); } 它的输出: [+57] 我以某种方式感到困惑:我告诉他将输出添加到宽度3(03ld),但是,如果我强迫输出将输出放在数字之前(+)如果数字的长度已经为2位数字(如57中),则不会添加所需的零.对于 来自/a> (0) - >指定填充时的左填充号(0)而不是空格(请参阅宽度子分类器). (+) - >将结果带有加号或负符号(+或 - )的力,即使对于正数.默认情况下,只有一个 - 符号之前的负数. (宽度) - >要打印的字符数量最少.如果要打印的值短于此数字,则结果是空白空间.即使结果更大,该值也不会被截断. 所以我只需要澄清...上面引用的(width)指定符是指由此格式指定器("%+03ld")控制的输出字符串(即:将要打印的字符)的全长(即:字符).或将要打印
0 2024-04-08
编程技术问答社区
什么叫'大多数C系统提供逻辑上无限的浮动值'?
最初我将变量x和y称为类型int: #include int main(){ int x, y = 0 ; x = 1 / y; printf("%d", x); return 0; } 程序崩溃了(出于明显的原因). 现在,我将变量x和y声明为double: #include int main(){ double x, y = 0 ; x = 1 / y; printf("%d", x); return 0; } 但输出:0.(为什么?) 然后我将%d更改为printf中的%f: #include int main(){ double x, y = 0 ; x = 1 / y; printf("%f", x);
0 2024-04-08
编程技术问答社区
将简短的int复制到char阵列
我有一个称为s_int的简短整数变量,该变量保持值= 2 unsighed short s_int = 2; 我想将此号码复制到字符阵列的第一个和第二位置. 假设我们有char buffer[10];.我们希望在s_int和buffer[1]中复制两个字节. 我该怎么做? 解决方案 通常的方法是将其切成薄片和切成薄片,一次字节: : b[0] = si & 0xff; b[1] = (si >> 8) & 0xff; 虽然这确实应该在unsigned char中完成,而不是在大多数系统上签名的普通char. 可以以类似的方式或以循环方式来存储较大的整数. 其他解决方案 *((short*)buffer) = s_int; 但 viator emptor ,由此产生的字节顺序会随着endianness而变化. 其他解决方案 我会记住它,类似 memcpy(buffer, &s_int, 2); 可以正确保留end
10 2024-04-08
编程技术问答社区
printf("%f",x) ok, printf("%F",x) error 格式参数太多。
为什么当我在CodeBlocks中使用Specifier F时,编译器给我错误的"格式过多"? #include int main() { float x = 3.14159; printf("%f\n", x); printf("%F\n", x); return 0; } 错误: error: unknown conversion type character 'F' in format [-Werror=format=] error: too many arguments for format [-Werror=format-extra-args] 解决方案 看起来某些版本的GCC无法识别%F,奇怪的是.我的gcc version 9.2.0 (tdm64-1)对于具有C11标准的Windows,尽管它仅发布那些警告消息而不是错误,但并未识别它. $ gcc main2.c -Wextra -Wal
0 2024-04-08
编程技术问答社区
是否有一个printf指定符需要浮点数而不是双数?
当我使用snprintf的"%f"指示符带有类型float的参数时,我会遇到MISRA类型错误. 根据我的研究,Misra是正确的,因为"%f"期望某种double. 是否有浮点说明器或修饰符,它将使用float键入参数而不是double? 我正在处理嵌入式系统,不想将32位浮点转换为64位double只是为了取悦snprintf函数.代码打印到调试/控制台端口,这是唯一发生转换的地方. 对于那些需要代码示例的人: // This section is for those C++ purists and it fulfills the C++ tag. #if __cplusplus #include #else #include #endif #define BUFFER_SIZE (128U) int main(void) { char buffer[BUFFER_SIZE]; float my_
0 2024-04-08
编程技术问答社区
为什么gcc -Wformat对无符号int的printf %d没有警告?
以下程序具有未定义的行为: #include int main(void) { unsigned int x = -100; // This is fine, becomes UINT_MAX - 100 printf("%d\n", x); // This is undefined behavior. return 0; } c99 7.19.6.1p8状态%d期望一个INT参数. c99 7.19.6.1p9指出:"如果任何参数不是正确的类型 相应的转换规范,行为是 未定义的." 但是,gcc (-Wall中包含)不会抱怨上述程序,为什么?这是一个错误还是故意的遗漏? 来自GCC manpage: -Wformat 检查对"printf"和"scanf"等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换有意义 解决方案 我最好的猜测是,警告是因为UB被 valu
0 2024-04-08
编程技术问答社区
scanf %u 负数?
我已经尝试了scanf("%u",&number),并且我输入了负号,问题是当i printf("%d",number)得到负数时.我认为这将阻止我阅读负数. scanf("%d",&number)和scanf("%u",&number)真的是同一件事吗? 还是仅用于可读性. 我在做一个叫做不确定的行为的事情吗? 编辑: 来自 wikipedia 我读过: %u:扫描小数未签名的int(请注意,在C99标准中 输入值减去符号是可选的,因此,如果读取负符号,则没有 错误将出现,结果将是两者的补充 负数,可能是非常大的价值. 这有点令人困惑的阅读,因此答案及以上.有人可以更清楚吗? 解决方案 是的,无论哪种方式,它都是未定义的行为. 考虑变量number是类型unsigned,%d in printf()期望的是signed int类型的参数,传递unsigned type是ub. otoh,如果number是签名类型,则使用%u进行扫描.
2 2024-04-08
编程技术问答社区
`printf()`中的格式指定符"%qd "的作用是什么?
我看到了格式指示符%qd浏览#include int main() { long long num = 1; printf("%qd\n", num); return 0; } printf() in printf()中格式指定%qd的目的是什么? 解决方案 %qd旨在在所有人上舒适地处理64位 机器,最初是BSD-ISM(quad_t). 但是,egcs(和gcc之前)将其视为等同于ll 并非总是等效的:配置了OpenBSD-Alpha,以便long是 64位,因此quad_t被打字到long. 在这种特殊情况下,类似printf的属性不起作用 打算. 如果sizeof(long long) == sizeof(long)在OpenBSD-Alpha上,它应该有效 无论如何 - 即%ld,%lld和%qd应该可以互换.在OpenBSD/Alpha上,sizeof(long) == sizeof(long long) == 8. 在
6 2024-04-07
编程技术问答社区
%ul和%lu的C格式指定符之间有什么区别?
在" C Primer Plus"的示例中,作者已将%ul格式指定符(在scanf和printf中)用于 unsigned long .当我尝试概括问题时,似乎%ul在我的计算机上犯了一些问题.但是使用%lu解决了问题. 实际上,我不是要关注问题和代码线,而是想知道%ul和%lu之间的差异.也许我可以弄清楚怎么了. 搜索没有给我一些有用的东西(除了"它们不同"). 任何解释或链接/参考都将不胜感激. 解决方案 %lu是正确的,而%ul是不正确. a printf 格式指定器遵循表格%[flags][width][.precision][length]specifier. P> u是 specifier 的意思是"未签名的十进制整数". l是长度修改器的意思是"长". 长度修饰符应在转换之前进行 specifier ,这意味着%lu是正确的.
0 2024-04-07
编程技术问答社区