Проверка символов строки

#c #string

#c #строка

Вопрос:

я должен реализовать две очень похожие функции, но у меня возникают проблемы.

  1. Я должен прочитать строку «имя пользователя», эта строка может содержать только буквы (в верхнем и нижнем регистре) и пробелы.
  2. Я должен прочитать строку «ключ», эта строка может содержать только буквы (в верхнем и нижнем регистре) и цифры. Если рекомендации не соблюдаются, пользователь должен иметь возможность получить входные данные. К сожалению, я не могу использовать специальные библиотеки (только stdio и stdlib). Я понял это:
     void checkString(char *i){
        int cont;
        do {
            scanf("%s", i);
            if (checkStrLen(6, 6, i) != 0) { //function that controls the size of the string (min,max,string)
                for(cont=0; cont<6;){
                    if((i[cont]>='0' amp;amp; i[cont]<='9')||
                      (i[cont]>='A' amp;amp; i[cont]<='Z')||
                      (i[cont]>='a' amp;amp; i[cont]<='z')){
                        cont  ;
                    }else{
                        printf("Not valid character");
                        printf("Try again");
                    }
            }
        }else{
            printf("nToo large string");
            printf("nTry again");
        }
    }while(1);
}
 

Я думал о том, чтобы сделать что-то подобное.
Для первой проблемы я бы заменил (i[cont]>='0' amp;amp; i[cont]<='9') на (i[cont]==' ') .
проблема в том, что я не понимаю, как выйти из for, если я нахожу запрещенный символ во время цикла.
Я думал об использовании разрыва, но это избавило бы меня от всей функции.
любой совет?
PS как выглядит функция? может ли это быть нормально или это совершенно неправильно?

Комментарии:

1. Включают ли «специальные библиотеки» стандартную библиотеку C?

2. Если вы можете использовать printf и scanf , вы должны быть в состоянии использовать isalnum и т.д. Но я не могу понять, почему кто-то преподает курс и позволяет вам использовать scanf его.

3. @EugeneSh. я могу использовать только stdio и stdlib

4. Просто сделайте: else{ printf("Not valid character"); printf("Try again"); break; } неверно, что break это выведет вас из функции, это нарушает только ближайший цикл. В любом случае, while это бесконечный цикл, вам нужно ввести в него какое-то условие выхода.

5. @Davide Я уже пробовал использовать разрывы, но это все еще не работает. Я использую while (1), потому что, пока пользователь не вставит правильную строку, программа должна предоставить возможность повторно вставить ее.

Ответ №1:

Я думаю, что цикл do while здесь не нужен. сначала выполните scanf и получите пользовательский ввод, а затем вызовите checkString . Внутри контрольной строки сохраните ваш оператор if else.

 char checkString(char *i){
        int cont;
            
        if (checkStrLen(6, 6, i) != 0) { //function that controls the size of the string (min,max,string)
                for(cont=0; cont<6;){
                    if((i[cont]>='0' amp;amp; i[cont]<='9')||
                      (i[cont]>='A' amp;amp; i[cont]<='Z')||
                      (i[cont]>='a' amp;amp; i[cont]<='z')){
                        cont  ;
                    }else{
                        printf("Not valid character");
                        printf("Try again");
                        return i;
                    }
            }
        }
        else{
            printf("nToo large string");
            printf("nTry again");
        }
}
 

Комментарии:

1. Проблема в том, что при использовании этого метода, если пользователь совершает ошибку и вводит неавторизованный символ, он не может повторно ввести строку

Ответ №2:

 #include <stdio.h>

#define MAXSIZE 100
#define SIZELIM 6
#define true    1
#define false   0

// Returns length of string
// If possible, use strlen() from <string.h> instead
int strlen(char *str) {
    char i;

    for (i = 0; str[i] != 0 amp;amp; str[i] != 'n'; i  );
    return i;
}

// Returns 1 if strings are equal
// If possible, use strcmp() from <string.h> instead
int streq(const char *x, const char *y) {
    char chrx = 1, chry = 1, i;

    for (i = 0;
         chrx != 0 amp;amp; chry != 0 amp;amp; chrx == chry;
         chrx = x[i], chry = y[i], i  );
    return chrx == chry;
}

// Returns 1 if chr is number or letter
// If possible, use isalnum() from <ctype.h> instead
int isalnum(const char chr) {
    return (chr >= '0' amp;amp; chr <= '9' ||
            chr >= 'A' amp;amp; chr <= 'Z' ||
            chr >= 'a' amp;amp; chr <= 'z');
}

// Checks if string contains numbers and letters only
int isvalid(const char *str) {
    int valid = true;

    for (int i = 0; str[i] != 0 amp;amp; str[i] != 'n'; i  ) {
        if (!isalnum(str[i])) {
            valid = false;
            break;
        }
    }
    return valid;
}

// Main
int main(void) {
    char str[MAXSIZE];

    for (;;) {
        printf("> ");
        fgets(str, MAXSIZE, stdin);
        if (streq(str, "quitn"))
            break;
        if (strlen(str) > SIZELIM || !isvalid(str)) {
            if (strlen(str) > SIZELIM)
                puts("String too large");
            else if (!isvalid(str))
                puts("Not a valid string");
            puts("Try again"); }
        }
    return 0;
}
 

Комментарии:

1. Не стесняйтесь задавать мне вопросы о моей реализации. Я бы прокомментировал свое объяснение каждой функции, но в итоге это заняло слишком много места.

Ответ №3:

Вы можете кодировать те функции, которые не можете импортировать:

 int letters_and_spaces(char c)
{
   return c == ' ' || C >= 'a' amp;amp; c <= 'z' || c >= 'A' amp;amp; c <= 'Z';
}

int letters_and_numbers(char c)
{
    return c >= '0' amp;amp; c <= '9' || C >= 'a' amp;amp; c <= 'z' || c >= 'A' amp;amp; c <= 'Z';
}
 

И использовать scanf для чтения пробелов, которые вы не можете использовать %s . Вы могли бы изменить на:

 scanf("0[^n]*c", i);
 

БУДЬТЕ ОСТОРОЖНЫ: я поставил 100, предположим i , для этого достаточно места. Он будет считывать до 100 символов (или столько, сколько вы там указали) или пока не найдет n .