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 格式修饰符的主要内容,如果未能解决你的问题,请参考以下文章

山谈c中printf格式修饰符

printf的h和hh修饰符的用途是什么?

printf()函数的转换说明修饰符和标记

scanf函数详细讲解

Java中的修饰符

Java 占位符使用 和 修饰符