#c #string
#c #строка
Вопрос:
я должен реализовать две очень похожие функции, но у меня возникают проблемы.
- Я должен прочитать строку «имя пользователя», эта строка может содержать только буквы (в верхнем и нижнем регистре) и пробелы.
- Я должен прочитать строку «ключ», эта строка может содержать только буквы (в верхнем и нижнем регистре) и цифры. Если рекомендации не соблюдаются, пользователь должен иметь возможность получить входные данные. К сожалению, я не могу использовать специальные библиотеки (только 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
.