【发布时间】:2019-09-21 16:24:07
【问题描述】:
您好,我仅限于 stdio.h、stdlib.h 和 string.h,我需要询问用户输入 - 输入可以是 1 到 6 之间的任意数量的字符,但前两个字符必须是大写字母,其余四个字符必须是 0 到 9 之间的数字。
有效输入示例:
- AB1
- AB1234
- AB
- 一个
无效输入示例:
- AB12345(字符过多)
- 123(前两个字符不是大写字母)
- ABA(第二个字符之后的字符不是数值)
这是我迄今为止的尝试(请记住,我几乎没有使用 C 的经验,这个解决方案“惯用”的可能性几乎没有,我问这个的原因是为了让我可以学习) :
Flightcode 是一个定义为flightcode[7] 的字符数组,它位于另一个名为flight 的结构中。我先将 fgetsing 到 temp_array[7] 中,然后将 strcpying 到 flight->flightcode 中,以便附加空终止符,我不知道更好的方法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_FLIGHTCODE_LEN 6
#define MAX_CITYCODE_LEN 3
#define MAX_NUM_FLIGHTS 50
#define DB_NAME "database"
typedef struct {
int month;
int day;
int hour;
int minute;
} date_time_t;
typedef struct {
char flightcode[MAX_FLIGHTCODE_LEN + 1];
date_time_t departure_dt;
char arrival_city[MAX_CITYCODE_LEN + 1];
date_time_t arrival_dt;
} flight_t;
date_time_t departure_dt;
date_time_t arrival_dt;
char * scanline(char *dest, int dest_len);
int main(){
char temp_string[100];
flight_t flight[MAX_NUM_FLIGHTS + 1];
int correct_code = 0;
printf("Enter flight code>\n");
scanline(temp_string, sizeof(flight->flightcode));
strcpy(flight->flightcode, temp_string);
while(correct_code == 0)
{
for(int i = 0; flight->flightcode[i] != '\0' && correct_code == 0; i++)
{
while((i < 2 && (flight->flightcode[i] <= 64 || flight->flightcode[i] >= 91)) || (i > 1 && (flight->flightcode[i] < 48 || flight->flightcode[i] >= 58)))
{
printf("Invalid input.\n");
scanline(temp_string, sizeof(flight->flightcode));
strcpy(flight->flightcode, temp_string);
}
if((i < 2 && (flight->flightcode[i] > 64 || flight->flightcode[i] < 91)) || (i > 1 && (flight->flightcode[i] >= 48 || flight->flightcode[i] < 58)))
{
correct_code = 1;
}
}
}
}
char * scanline(char *dest, int dest_len){
int i, ch;
i = 0;
for (ch = getchar();
ch != '\n' && ch != EOF && i < dest_len -1; ch = getchar())
dest[i++] = ch;
dest[i] = '\0';
while (ch != '\n' && ch != EOF)
ch = getchar();
return (dest);
}
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
-
可以使用ctypes.h中的字符分类函数吗?
-
@SergeBallesta 不幸的是,我不能,我正在使用 ascii 等效项进行字符检查。
-
@DavideLorino 如果没问题记得采纳答案。
-
您的问题到底是什么?如果它与您的解决方案的质量有关,那么它可能更适合Code Review。