#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] != ''
Это должно работать просто отлично