【问题标题】:scanf and printf format modifiersscanf 和 printf 格式修饰符
【发布时间】: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')来保存。

标签: c string printf modifier


【解决方案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() 应该包含格式字符串的大小限制。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多