有没有办法在 scanf 中使用变量/常量而不是数字来格式化 %s?
Posted
技术标签:
【中文标题】有没有办法在 scanf 中使用变量/常量而不是数字来格式化 %s?【英文标题】:Is there any way to format %s in scanf using not a nubmer but a variable/constant? 【发布时间】:2021-12-31 03:25:27 【问题描述】:我的意思是我们有 MAX_LENGTH 值,所以我想限制字符串格式长度 使用它,但不是像 12 这样的数字。
#include <stdio.h>
#define MAX_LENGTH 12
int main(void)
char first_name[MAX_LENGTH + 1], last_name[MAX_LENGTH + 1];
printf("Пожалуйста, введите ваше имя: ");
scanf("%12s", first_name);
char ch; // Clearing the buffer to fix a bug when the input
while((ch = getchar()) != '\n' && ch != EOF); // string lenght is greater than MAX_LENGTH.
printf("Пожалуйста, введите фамилию: "); // So, I made it 12 just to show that in case of string length > 12
scanf("%12s", last_name); // the program doesn't crash but just cuts the string.
printf("Ваши данные: %s %s\n", last_name, first_name);
return 0;
我想做类似的事情
printf("%.*s", MAX_LENGTH, string);
但使用 scanf 函数。只是不要在每次更改 MAX_LENGTH 时都修复它。
【问题讨论】:
你可以做#define XSTRING(n) #n #define STRING(n) XSTRING(n) "%" STRING(MAX_LENGTH) "s"
,但它并不漂亮。
scanf
中的星号表示“忽略此转换”。如果您想在运行时确定 %42s
中的数字,您可以使用 sprintf
即时生成格式字符串。
【参考方案1】:
您可以使用任何字符串作为scanf
的格式。也可以是变量。
#include <stdio.h>
int main(void)
char format[16];
char string[16];
size_t maxLength;
if(scanf("%zu", &maxLength) != 1) /* handle error */
sprintf(format, "%%%zus", maxLength);
if(scanf(format, string) != 1) /* handle error */
printf("`%s`\n", string);
结果:
`12345`
【讨论】:
以上是关于有没有办法在 scanf 中使用变量/常量而不是数字来格式化 %s?的主要内容,如果未能解决你的问题,请参考以下文章
执行包任务 - 有没有办法将Child Package参数绑定到常量?
有没有办法在 Ruby YAML 文件中指定 ruby 类/模块常量作为值