gpt4 book ai didi

c - 类型检查 ANSI C 中的任意长度数组

转载 作者:太空狗 更新时间:2023-10-29 15:28:10 25 4
gpt4 key购买 nike

您好,我仅限于 stdio.h、stdlib.h 和 string.h,我需要询问用户输入 - 输入可以是 1 到 6 之间的任意数量的字符,但是前两个字符必须是大写字母,其余四个字符必须是 0 到 9 之间的数字。

有效输入示例:

  • AB1
  • AB1234
  • AB
  • 一个

无效输入示例:

  • AB12345(字符过多)
  • 123(前两个字符不是大写字母)
  • ABA(第二个后面的字符不是数值)

这是我到目前为止的尝试(请记住,我几乎没有使用 C 的经验,这个解决方案是“惯用的”的可能性几乎没有,我问这个的原因是为了让我可以学习) :

Flightcode 是一个定义为 flightcode[7] 的字符数组,它位于另一个名为 flight 的结构中。我首先将 fgets 转换成 temp_array[7] 然后将它 strcpy 转换成 flight->flightcode 这样 null 终止符是附加,我不知道这样做的更好方法。

#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);
}

最佳答案

扫描集和 %n 说明符可用于解析输入。
格式字符串 "%n%2[A-Z]%n%4[0-9]%n" 在三个地方使用了 %n 说明符来捕获数量字符处理。如果字符在大写字母集中,扫描集 %2[A-Z] 将扫描最多两个字符。 %4[0-9] 如果字符是数字,则最多扫描四个字符。
如果 sscanf 扫描了两个值,则减去处理的字符数以确保有两个前导大写字符和六个或更少的总字符,尾随字符是终止零。

#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(){
int head = 0, leading = 0, tail = 0;
int correct_code = 0;
int result = 0;
char temp_string[100];
char upper[3] = "";
char digits[5] = "";
flight_t flight[MAX_NUM_FLIGHTS + 1];
do {
printf("Enter flight code>\n");

scanline(temp_string, sizeof(temp_string));
if ( 0 < ( result = sscanf ( temp_string, "%n%2[A-Z]%n%4[0-9]%n", &head, upper, &leading, digits, &tail))) {
if ( 1 == result && 0 == temp_string[leading]) {
correct_code = 1;
break;
}
if ( 2 == result && 2 == leading - head && 7 > tail - head && 0 == temp_string[tail]) {
correct_code = 1;
}
else {
printf ( "invalid input\n");
}
}
else {
printf ( "invalid input\n");
}
} while(correct_code == 0);
printf ( "Input is: %s\n", temp_string);
strcpy(flight->flightcode, temp_string);
return 0;
}

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;
}

关于c - 类型检查 ANSI C 中的任意长度数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55964439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com