scanf 和 printf 格式修饰符
Posted
技术标签:
【中文标题】scanf 和 printf 格式修饰符【英文标题】:scanf and printf format modifiers 【发布时间】:2014-06-11 14:29:01 【问题描述】:我需要 C Primer Plus 对这个练习的帮助。
编写一个程序,请求您的名字并使用它执行以下操作: 将其打印在比名称宽三个字符的字段中
#include<stdio.h>
#include<string.h>
int main()
char a[40];
int p,v=0;
printf("Enter your first name: \n");
scanf("%s",a);
p= strlen(a);
v==p+3;
printf("%s",a);
我不知道如何使用什么作为宽度的修饰符 我应该在 % 和 s 之间添加什么?
【问题讨论】:
我的名字是“1234567890123456789012345678901234567890 nop nop nop jmp 0x70002345” “在字段中打印...”:名称在字段中是右对齐还是左对齐? @GradyPlayer 想说的是:你有一个缓冲区溢出,你输入的名字超过 40 个字符。您应该注意始终将输入限制为保留内存的最大长度! 使用if (scanf("%39s",a) != 1) Handle_NoValidInput()
。 39
防止@Peter Miehle 和 Grady Player 提到的缓冲区溢出。非空格char
要扫描的最大宽度是39,代码需要39 char
+ 1(对于'\0'
)来保存。
【参考方案1】:
本练习的目的是阅读和理解 printf() 的手册页。阅读部分只能由您完成,没有捷径可走。格式说明符是 C 编程中最复杂的章节(其他人会说“指针”),知道在哪里查找需要记住的内容(手册页)是非常明智的。
读完后,您应该对格式说明符 %s 及其所有可能性有一点(或很大)的了解。
EDITH:当你读完,还有一个问题是使用“%*.*s”还是“%s”还是“%-.*s”等,请回来更新问题.
【讨论】:
这是 OP 需要听到的答案。学习 C 语言最复杂的部分没有捷径可走。 +1【参考方案2】:这是一种方法:
#include<stdio.h>
#include<string.h>
int main()
char a[40];
printf("Enter your first name: \n");
scanf("%s",a);
printf("[%-*s]", (int)(3 + strlen(a)), a);
return(0);
printf() 函数可以做到这一切。
从问题代码中可以看出,“%s
”作为格式字符串是理解的。
“%*s
”的格式字符串允许调用者放置指定的(空格填充的)宽度。例如:
printf("%*s", 10, "Hello");
上面将在 10 个字符的框架中打印“Hello
”(如预期的那样)。因此,上面的命令实际上会打印:“ Hello
”。
要将空格放在另一侧,请使用以下命令告诉 printf() 使字符串左对齐:
printf("%-*s", 10, "Hello");
这会导致打印:“Hello
”
【讨论】:
+1 我想知道为什么演员(int)
,但现在了解它的需要,因为 strlen()
返回类型 size_t
可能超过 int
。建议检查scanf()
结果。
代码仍然假定输入的名称少于 39 个字符。因此,scanf() 应该包含格式字符串的大小限制。以上是关于scanf 和 printf 格式修饰符的主要内容,如果未能解决你的问题,请参考以下文章