【问题标题】:Is there any way to format %s in scanf using not a nubmer but a variable/constant?有没有办法在 scanf 中使用变量/常量而不是数字来格式化 %s?
【发布时间】: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 即时生成格式字符串。

标签: c input scanf


【解决方案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`

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 2010-09-06
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多