В C, что я могу использовать вместо strlen, если я не хочу использовать строковую функцию?

#c #string #strlen

#c #строка #strlen

Вопрос:

Недавно я начал изучать basic C, и я все еще новичок в этом, я начал делать некоторые проекты для обучения, и я использую библиотечные функции, но меня интересуют другие методы…

Итак, у меня есть проверка электронной почты, она работает нормально, но я хочу сделать это без strlen каких-либо предложений, что я могу сделать вместо strlen ?

 void mail(char e[]) {
    int count = 0;
    int countb = 0;
    int i, j;
    int t, t2;
    int p = 0;

    for (i = 0; i < strlen(e); i  ) {
        if (e[i] == '@') {
            count  ;
            t = i;
        }
    }
    if (count == 1) {
        for (j = 0; j < t; j  ) {
            if (!(e[j] == '_' || e[j] == '.' || isalpha(e[j]) || isdigit(e[j]))) {
                p = -1;
                printf("nwrongn");
                break;
            }
        }
        if (p == 0) {
            for (i = t; i < strlen(e); i  ) {
                if (e[i] == '.') {
                    t2 = i;
                    countb  ;
                }
            }
            if (countb == 1) {
                for (i = 0; i < t2 amp;amp; i > t2; i  ) {
                    if (!(isalpha(e[i]))) {
                        p = -1;
                        printf("nwrongn");
                        break;
                    } else {
                        p = 1;
                    }
                }
                if (p == 1) {
                    if (e[t2   3] != '') {
                        p = -1;
                        printf("nwrongn");
                    }
                }
            } else {
                p =- 1;
                printf("nwrongn");
            }
        }
    } else {
        p = -1;
        printf("nwrongn");
    }
    return;
}
 

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

1. Что плохого в использовании strlen ?

2. strlen выполняет ненужную работу в этом случае, потому что строка не изменяется, поэтому я пытаюсь упростить

3. Измените свою функцию на void mail(char e[], size_t len) … сделайте вызывающего ответственным за передачу длины.

Ответ №1:

Вместо сравнения i < strlen(e) вы можете проверить, не является ли байт со смещением i нулевым терминатором : e[i] != '' .

Вы также можете вычислить длину строки только один раз в начале функции и сохранить ее в len переменной.

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

1. Действительно, не вызывайте strlen повторно в состоянии цикла, когда строка не меняется!

2. Да, я думаю, это то, что я искал, спасибо 🙂

Ответ №2:

Единственное, что вы можете сделать, это реализовать свою собственную функцию strlen .

В C строки представляют собой массивы символов с нулевым завершением, что означает, что последним символом массива является » (ноль). Функция strlen перебирает массив символов до тех пор, пока не будет найден нулевой символ, она возвращает длину этого массива, нулевой символ не включен.

Чтобы дублировать (создать) c-строку, вам нужно выполнить следующее:

 char *str = malloc(strlen(another_string)   1);
str[strlen(another_string)] = '';
 

Пример для strlen:

 size_t my_strlen(const char *str)
{
    if (!str) return 0;
    size_t n = 0;
    for (; *str;   n,   str);
    return n;
}
 

Ответ №3:

Вы можете создать свой собственный my_strlen 🙂

 unsigned int      my_strlen(char *str)
 

или

вы можете выполнять цикл, пока ваш символ отличается от » (нулевой байт). Так что просто замените strlen(e) на e[i] != ''

Это должно работать просто отлично