将用户输入限制为 C 中的 5 位数字

Restrict user input to 5 digits in C

我被分配让用户输入一个 5 位数字,验证它并以相反的顺序打印回来,我已经弄清楚了相反的部分但我正在努力弄清楚如何按顺序验证变量强制用户使用 5 位数字

#include <stdio.h>
int main() {
    int n, inv = 0, inverso;
    printf("Introduce un numero de 5 digitos: ");
    scanf("%d", &n);
    while (n != 0) {
        inverso = n % 10;
        inv = inv * 10 + inverso;
        n /= 10;
    }
    printf("El numero invertido es = %d", inv);
    return 0;
}

我会读入一个字符串,验证长度为5,并且所有字符都是数字。验证失败提示重复

然后简单地以相反的顺序打印该字符串。

例如:

int n, inv = 0, inverso;
char buff[100];
int repeat = 1;
while (repeat) {
    printf("Introduce un numero de 5 digitos: ");
    scanf("%s", buff);
    repeat = 0; 
    if (strlen(buff) != 5) {
        printf("You must type 5 digits\n");
        repeat = 1;
        continue;
    }
    for (int i = 0; i < 5; ++i) {
        if (!isdigit(buff[i])) {
            printf("%c is not a digit\n");
            repeat = 1;
            continue;
        }
    }
}
printf("\nEl numero invertido es = ");
for (int i = 4; i >= 0; --i) {
    printf("%c", buff[i]);
}

如果输入大于 5,您可以拒绝输入并向用户发出信号,或者您可以截断输入(在验证后)以防止溢出最大大小。例如:

if (strlen(string) > 5) string[5] = '[=10=]';

然后正常继续(可能向用户发出其输入已被截断的信号)(优点是不会强制用户再次输入)。

由于您已经在循环中逐位处理用户输入的数字,因此只需添加一个在 0 处初始化的 count 变量是有意义的,该变量会在每个循环迭代中递增:

int count = 0;
while (n != 0) {
        inverso = n % 10;
        inv = inv * 10 + inverso;
        n /= 10;
        count++;
    }

您的用户输入中有 count 个数字。

也就是说,在这种情况下,除非您的家庭作业或练习禁止将用户输入处理为字符串而不是整数,否则这确实是可行的方法,因为它要简单得多。

这是一个简单的测试,用于检查 n 是否有 5 个数字:

if (n >= 10000 && n <= 99999) {
    // n has 5 digits
} else {
    // try again
}

这是修改后的版本:

#include <stdio.h>

int main() {
    int c, n, inv;

    for (;;) {
        printf("Introduce un numero de 5 digitos: ");
        if (scanf("%d", &n) == 1 && n >= 10000 && n <= 99999)
            break;
        while ((c = getchar()) != '\n') {
            if (c == EOF)  // unexpected end of file
                return 1;
        }
        printf("Invalid input, try again\n");
    }
    inv = 0; 
    while (n != 0) {
        inv = inv * 10 + n % 10;
        n /= 10;
    }
    printf("El numero invertido es = %d\n", inv);
    return 0;
}

使用fgets() 将输入读取为字符串。稍后验证输入不再是 5 位数字并用 sscanf() 解析它。更好的是你可以避免转换它而只是反向打印它。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LENGTH 500

int main()
{
    char buff[500] = {0};
    char *numbers = "0123456789";

    if (!fgets(buff,MAX_LENGTH,stdin))
    {
        fprintf(stderr,"input error...\n");
        exit(EXIT_FAILURE);
    }

    buff[strcspn(buff, "\n")] = 0; /* removing newline character from the buffer */

    if (strspn(buff,numbers) != strlen(buff)) /* making sure input is only numbers */
    {
        printf("only numbers allowed\n");
        exit(EXIT_FAILURE);
    }

    for (size_t i = 0, len = strlen(buff); i <= len; i++)
    {
        putchar(buff[len-i]);
    }


  return 0;
}

sscanf() 备选方案:

if (!fgets(buff,MAX_LENGTH,stdin))
{
    fprintf(stderr,"input error...\n");
    exit(EXIT_FAILURE);
}

if (sscanf(buff,"%ld",&number) != 1) /* always check the result of scanf() */
{
    fprintf(stderr,"input failure\n");
    exit(EXIT_FAILURE);
}

/* reverse the number */

我会尝试一种更非正统的方式,因为您的输入已经是一个 String(char)。

#include <stdio.h>
int len;
char buff[100];
int main()
{
     
     scanf("%s", buff);
     
     len = strlen(buff);
     
}

从那里您可以将字符串的长度以 int 形式存储在变量 len 中。

您将继续编写 if 代码来处理 len 大于 5 时发生的情况。

希望我有所帮助!