Как я могу просмотреть все символы строки и проверить, все ли они числа в C? - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь найти способ проверить все символы строки. После поиска в Интернете я обнаружил, что могу создать функцию для этого, но по какой-то причине она не работает, даже если она довольно проста. Вот код, который у меня есть:

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

struct id{
    char id_num[10];
};

int isNumber(char p[])
{
    int i;
    for(i=0; i<strlen(p); i++){
        if(isdigit(p[i])){
            return 0;
        }
        else return 1;
    }
}


void read(struct id s)
{
    int len1;
    do{ 
        printf("Give id number: ");
        scanf("%s", s.id_num);
        len1 = strlen(s.id_num);
    } while(len1 < 0 || len1 > 10 || isNumber(s.id_num) == 1);
}

int main(void)
{
    struct id a;
    read(a);
}

На случай, если вам интересно, почему я сделал id_num символьной строкой, потому что мне нужно, чтобы число было от 0 до 10 символов. Кроме того, код не содержит ошибок, но требует всего, что я ввожу. Например, он принимает «5555tt», когда не должен. Что я сделал не так? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 10 января 2020

Для начала функция read должна принимать свой аргумент по ссылке, например

void read(struct id *s);

В противном случае ее аргумент не имеет смысла.

Обратите внимание, что такой вызов scanf

scanf("%s", s.id_num);

небезопасно. Используйте вместо fgets. Для примера

void read( struct id *s )
{
    //...
    fgets( s->id_num, sizeof( s->id_num ), stdin );
    s->id_num[strcspn( s->id_num, "\n" )] = '\0';

Функция isNumber очень проста.

int isNumber( const char p[] ) 
{
    const char *s = p;
    while ( isdigit( ( unsigned char )*s ) ) ++s;

    return  p[0] != '\0' && *s == '\0';
}

То есть переданная строка не должна быть пустой (условие p[0] != '\0'). В противном случае очевидно, что он не содержит все цифры.

Второе условие *s == '\0' означает, что мы проверяли все символы строки до конечного нуля. То есть строка содержит только цифры.

Вот демонстрационная программа.

#include <stdio.h>
#include <ctype.h>

int isNumber( const char p[] ) 
{
    const char *s = p;
    while ( isdigit( ( unsigned char )*s ) ) ++s;

    return  p[0] != '\0' && *s == '\0';
}

int main(void) 
{
    printf( "Is a number - %s\n", isNumber( "" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "A" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "12A" ) ? "true" : "false"  );
    printf( "Is a number - %s\n", isNumber( "123" ) ? "true" : "false"  );

    return 0;
}

Ее вывод

Is a number - false
Is a number - false
Is a number - false
Is a number - true
0 голосов
/ 10 января 2020

В for l oop вы выходите, когда находите ди git. Поэтому, если первый символ 5, вы выходите из l oop. Вам нужно проверить все элементы и вернуться с 1, если не ди git.

int isNumber(char p[])
{
    int i;
    for(i=0; i<strlen(p); i++){
        if(!isdigit(p[i])){
            return 1;
        }
    }
    return 0;
}

Также функция read должна принимать параметр по адресу. void read(struct id *s)

void read(struct id *s)
{
    int len1;
    do{ 
        printf("Give id number: ");
        scanf("%s", s->id_num);
        len1 = strlen(s->id_num);
    } while((len1 < 0) || (len1 > 10) || (isNumber(s->id_num) == 1));
}
...