Tag: format specifiers

mingw printf尺寸规格字符h

Visual Studio有一个大小和距离规格图表 ,我可以这样做,使用h前缀指定单字节字符串,无论printf还是wprintf: int main() { char test[]= “abc”; _tprintf(_T(“%hs\n”),test); } 但是,如果我使用mingw gcc和-Wall编译相同的内容,我会得到以下警告: warning: format ‘%hs’ expects type ‘short int *’, but argument 2 has type ‘char *’ 我在做什么是一种可接受的方式来在mingw中指定单字节字符串? 谢谢 编辑 – 此问题已在下面详细解答。 简短的回答是肯定的,这是在mingw中指定单字节字符串的可接受方式,并且可以忽略警告。

关于C中短数据类型格式说明符的混淆

考虑以下计划: #include int main() { short a=9; //printf(“%hi\n”,a); printf(“%d”,a); // LINE 6 } 根据这个 ,短类型(签名)的格式说明符是%hi 短行型变量是否总是在对它执行任何操作之前自动提升为int ? 它是未定义的行为,如果我使用%d格式说明符来打印此程序中的变量值? 我使用gcc -Wall -Wextra -WFormat选项编译它,但仍然编译器没有显示任何单个警告。 为什么?

为什么gcc -Wformat没有在unsigned 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 -Wformat (包含在-Wall )不会抱怨上面的程序,为什么呢? 这是一个错误,还是故意遗漏? 从gcc手册页: -Wformat 检查对”printf”和”scanf”等的调用,以确保提供的参数具有适合指定格式字符串的类型,并确保格式字符串中指定的转换有意义

printf中的序列点

我在这里读到有一个序列点: 在与输入/输出转换格式说明符相关联的操作之后。 例如,在表达式printf(“foo %n %d”, &a, 42) ,在打印42之前评估%n之后存在序列点。 但是,当我运行此代码时 : int your_function(int a, int b) { return a – b; } int main(void) { int i = 10; printf(“%d – %d – %d\n”, i, your_function(++i, ++i), i); } 而不是我期望得到的: 12 – 0 – 12 这意味着没有为转换格式说明符创建序列点。 http://en.wikipedia.org是错误的,或者我只是误解了某些内容,或者在这种情况下gcc是否不合规(顺便提一下Visual Studio 2015会产生相同的意外结果)? 编辑: 我理解,对your_function的参数的计算顺序和分配给参数的顺序是未定义的。 我不是在问我为什么我的中期是0.我问为什么其他两个术语都是12。

在不同平台上使用void指针

我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符。 它为什么以及究竟是什么问题? int x=100; int *pi=&x; printf(“value of pi is: %p”,(void*)pi);

使用scanf()读取的字符串大小不超过

编辑:对于我的课,我必须使用scanf 。 所以推荐其他输入方式并不是我正在寻找的解决方案(如果有一个涉及scanf)。 如果我正在阅读小项目的用户输入(例如,游戏)。 可以说我问would you like to play? 这将接受yes或no答案。 所以我写了一些像这样的简单代码: #include int main(void) { char string[3]; //The max number of letters for “yes”. printf(“Would you like to play?”); scanf(“%s”, string); } 所以这段代码应该简单地要求他们输入yes或no 。 我将我的char array的长度设置为3 。 这样它足够大,可以保持yes ,也可以no 。 但是如果有人输入了诸如yesss无效输入,我知道如何比较yesss的字符串来处理这样的事件,但是这不会在技术上/可能覆盖我声明的其他局部变量,因为它会延伸到我的长度之外arrays? 如果是这样,有没有办法处理这个限制3个输入字符或什么? 如果没有,为什么/如何知道只输入3的大小? *注意:我是C的新手,我在这方面找不到多少所以即使这很简单,我也很感激。 因为我显然缺少一些东西。 我来自java背景,这甚至都不是问题。

如何使用printf格式化unsigned long long int?

#include int main() { unsigned long long int num = 285212672; //FYI: fits in 29 bits int normalInt = 5; printf(“My number is %d bytes wide and its value is %ul. A normal number is %d.\n”, sizeof(num), num, normalInt); return 0; } 输出: My number is 8 bytes wide and its value is 285212672l. A […]