Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANSI C中任意长度数组的类型检查_C_Arrays_String_Ansi C - Fatal编程技术网

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

ANSI C中任意长度数组的类型检查,c,arrays,string,ansi-c,C,Arrays,String,Ansi C,您好,我仅限于stdio.h、stdlib.h和string.h,我需要请求用户输入-输入可以是1到6之间的任意数量的字符,但是前两个字符必须是大写字母,其余四个字符必须是0到9之间的数字 有效输入的示例: AB1 AB1234 AB A 无效输入的示例: AB12345(字符太多) 123(前两个字符不是大写字母) ABA(第二个字符后的字符不是数值) 以下是我迄今为止的尝试(请记住,我几乎没有使用C的经验,这个解决方案“惯用”的可能性几乎没有,我问这个问题的原因是为了让我能够学习):

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

有效输入的示例:

  • AB1
  • AB1234
  • AB
  • A
无效输入的示例:

  • AB12345(字符太多)
  • 123(前两个字符不是大写字母)
  • ABA(第二个字符后的字符不是数值)
以下是我迄今为止的尝试(请记住,我几乎没有使用C的经验,这个解决方案“惯用”的可能性几乎没有,我问这个问题的原因是为了让我能够学习):

Flightcode是一个字符数组,定义为
Flightcode[7]
它位于另一个名为
flight
的结构中。我正在
fgets
首先将其放入
temp_数组[7]
中,然后
strcpy
将其放入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);
}
#包括
#包括
#包括
#定义最大飞行代码长度6
#定义最大城市代码长度3
#定义最大飞行次数50
#定义数据库名称“数据库”
类型定义结构{
整月;
国际日;
整小时;
整数分钟;
}日期时间;
类型定义结构{
char flightcode[MAX_flightcode_LEN+1];
日期时间出发日期;
字符到达城市[最大城市代码+1];
到达日期时间;
}飞行;;
日期时间出发日期;
到达日期时间;
char*扫描线(char*dest,int dest_len);
int main(){
字符临时字符串[100];
飞行时间[最大飞行次数+1];
int correct_code=0;
printf(“输入航班代码>\n”);
扫描线(临时字符串,sizeof(航班->航班代码));
strcpy(航班->航班代码,临时字符串);
while(正确的_代码==0)
{
对于(int i=0;flight->flightcode[i]!='\0'&&correct_code==0;i++)
{
而((i<2&&(flight->flightcode[i]>=91))| |(i>1&&(flight->flightcode[i]<48| | flightcode[i]>=58)))
{
printf(“无效输入。\n”);
扫描线(临时字符串,sizeof(航班->航班代码));
strcpy(航班->航班代码,临时字符串);
}
如果((i<2&&(航班->航班代码[i]>64||航班->航班代码[i]<91))|(i>1&&(航班->航班代码[i]>=48||航班->航班代码[i]<58)))
{
正确的_代码=1;
}
}
}
}
字符*扫描线(字符*目的地,内部目的地){
int i,ch;
i=0;
for(ch=getchar();
ch!='\n'&&ch!=EOF&&i
首先,要意识到您的问题文本缺少一个问题。此外,你的问题标题毫无意义

无论如何,这是一个可能的,故意的非常丑陋的解决方案。方法:您希望执行X,因此您编写了执行X的代码。让我们从
scanline()
开始:

我知道这很难看,但我相信澄清文件输入中涉及的三个步骤是有帮助的:读取、检查和使用。请注意,如果行达到所需的字符数(比容纳终止符的缓冲区大小小一个),则返回
true

然后您要检查是否:

  • scanline()
    成功
  • 至少有一个字符
  • 字符0介于“A”和“Z”之间
  • 字符1位于“A”和“Z”之间
  • 字符2介于“0”和“1”之间
  • 字符3介于“0”和“1”之间
  • 字符4介于“0”和“1”之间
  • 字符5介于“0”和“1”之间
  • 让我们为此编写代码:

    int main(void) 
    {
        flight_t flight;
    
        while (1) {
            printf("Enter flight code>\n");
            if (!scanline(flight.flightcode, sizeof(flight.flightcode))) {
                printf("Too many characters.\n");
                continue;
            }
            int i = 0;
            if (flight.flightcode[i] == 0) {
                printf("Empty input.\n");
                continue;
            }
            if (flight.flightcode[i] < 'A' || flight.flightcode[i] > 'Z') {
                printf("Character %d is not upper case.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < 'A' || flight.flightcode[i] > 'Z') {
                printf("Character %d is not upper case.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < '0' || flight.flightcode[i] > '9') {
                printf("Character %d is not a digit.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < '0' || flight.flightcode[i] > '9') {
                printf("Character %d is not a digit.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < '0' || flight.flightcode[i] > '9') {
                printf("Character %d is not a digit.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < '0' || flight.flightcode[i] > '9') {
                printf("Character %d is not a digit.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
        }
    }
    
    int main(无效)
    {
    飞行;;
    而(1){
    printf(“输入航班代码>\n”);
    如果(!scanline(flight.flightcode,sizeof(flight.flightcode))){
    printf(“字符太多。\n”);
    继续;
    }
    int i=0;
    if(flight.flightcode[i]==0){
    printf(“空输入。\n”);
    继续;
    }
    if(flight.flightcode[i]<'A'| | flight.flightcode[i]>'Z'){
    printf(“字符%d不是大写。\n”,i);
    继续;
    }
    i++;
    if(flight.flightcode[i]==0)
    打破
    if(flight.flightcode[i]<'A'| | flight.flightcode[i]>'Z'){
    printf(“字符%d不是大写。\n”,i);
    继续;
    }
    i++;
    if(flight.flightcode[i]==0)
    打破
    if(flight.flightcode[i]<'0'| | flight.flightcode[i]>'9'){
    printf(“字符%d不是数字。\n”,i);
    继续;
    }
    i++;
    if(flight.flightcode[i]==0)
    打破
    if(flight.flightcode[i]<'0'| | flight.flightcode[i]>'9'){
    printf(“字符%d不是数字。\n”,i);
    继续;
    }
    i++;
    if(flight.flightcode[i]==0)
    打破
    if(flight.flightcode[i]<'0'| | flight.flightcode[i]>'9'){
    printf(“字符%d不是数字。\n”,i);
    继续;
    }
    i++;
    if(flight.flightcode[i]==0)
    打破
    if(flight.flightcode[i]<'0'| | flight.flightcode[i]>'9'){
    printf(“字符%d不是数字。\n”,i);
    继续;
    }
    i++;
    if(flight.flightcode[i]==0)
    打破
    }
    }
    
    一些评论:

  • 在代码中,您可以在第一个字符正常后将
    correct_code
    设置为1。如果要循环使用这些字符,必须检查是否有错误并退出循环
  • 当您有特定的字符文本可用时,不要使用ASCII码
  • 我建议您采用我的解决方案,作为练习,修复它,以便能够与套利合作
    int main(void) 
    {
        flight_t flight;
    
        while (1) {
            printf("Enter flight code>\n");
            if (!scanline(flight.flightcode, sizeof(flight.flightcode))) {
                printf("Too many characters.\n");
                continue;
            }
            int i = 0;
            if (flight.flightcode[i] == 0) {
                printf("Empty input.\n");
                continue;
            }
            if (flight.flightcode[i] < 'A' || flight.flightcode[i] > 'Z') {
                printf("Character %d is not upper case.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < 'A' || flight.flightcode[i] > 'Z') {
                printf("Character %d is not upper case.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < '0' || flight.flightcode[i] > '9') {
                printf("Character %d is not a digit.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < '0' || flight.flightcode[i] > '9') {
                printf("Character %d is not a digit.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < '0' || flight.flightcode[i] > '9') {
                printf("Character %d is not a digit.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
            if (flight.flightcode[i] < '0' || flight.flightcode[i] > '9') {
                printf("Character %d is not a digit.\n", i);
                continue;
            }
            i++;
            if (flight.flightcode[i] == 0)
                break;
        }
    }
    
    #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;
    
    
    int main(void){
    
      char temp_string[100];
      flight_t flight[MAX_NUM_FLIGHTS + 1];
      int correct_code;
      size_t len;
      int i;
    
      do
      {
        /* we first assume the code is correct and set this to 0 on any error */
        correct_code = 1;
        printf("Enter flight code>\n");
    
        if(fgets(temp_string, sizeof(temp_string), stdin) == NULL)
        {
            if(feof(stdin)) fprintf(stderr, "no input (EOF)\n");
            else perror("fgets");
            correct_code = 0;
            temp_string[0] = '\0';
        }
    
        if(correct_code)
        {
          len = strlen(temp_string);
    
          /* cut off newline
           * Use a loop to handle CR and LF just in case Windows might leave more than one character */
          while((len > 0) &&
                ((temp_string[len - 1] == '\n') ||
                 (temp_string[len - 1] == '\r')))
          {
            len--;
            temp_string[len] == '\0';
          }
    
          if(len > MAX_FLIGHTCODE_LEN)
          {
            correct_code = 0;
            fprintf(stderr, "Input must not be longer than %d characters.\n", MAX_FLIGHTCODE_LEN);
          }
    
          if(len == 0)
          {
            correct_code = 0;
            fprintf(stderr, "Empty input.\n");
          }
        }
    
        /* check first two letters */
        for(i = 0; (i < 2) && (i < len) && correct_code; i++)
        {
          /* you could use function isupper when you make sure the locale is set to "C" */
          if((temp_string[i] < 'A') || (temp_string[i] > 'Z'))
          {
            correct_code = 0;
            fprintf(stderr, "first two characters must be uppercase letters. Found '%c' at position %d\n", temp_string[i], i);
          }
        }
    
        /* check digits starting from 3rd character */
        for(i = 2; (i < MAX_FLIGHTCODE_LEN) && (i < len) && correct_code; i++)
        {
          /* you could use function isdigit here */
          if((temp_string[i] < '0') || (temp_string[i] > '9'))
          {
            correct_code = 0;
            fprintf(stderr, "Third to last characters must be digits. Found '%c' at position %d\n", temp_string[i], i);
          }
        }
    
        if(correct_code)
        {
          /* we already checked that length is not more than MAX_FLIGHTCODE_LEN, so we don't need strncpy to avoid buffer overflow */
          strcpy(flight->flightcode, temp_string);
          printf("Valid code: %s\n", flight->flightcode);
        }
        else
        {
          fprintf(stderr, "Invalid code.\n");
        }
      } while(!correct_code);
    
      return 0;
    
    }
    
    #define TRUE 1
    #define FALSE 0
    
    inline int isupper(int c) {
        return c >= 'A' && c <= 'Z';  // only for ASCII and derived
    }
    inline int isdigit(char c) {
        return c >= '0' && c <= '9';    // guarantee per standard
    }
    inline int isblank(int c) {
        return c == ' ' || c == '\t';
    }
    inline int isspace(int c) {
        static const char spaces[] = " \t\r\n\v";
        for(const char *s=spaces; *s != '\0'; s++) {
            if (c == *s) return TRUE;
        }
        return FALSE;
    }
    
    char *get_string(char *buffer, int maxupper, int maxdigit, FILE *fd) {
        char buf[16];      // any size >=2 will fit
        char *cur = buffer;
        int state = 0, uppersize=0, digitsize=0;
        for (;;) {         // allow lines longer than buf
            if (NULL == fgets(buf, sizeof(buf), fd)) {
                *cur = '\0';           // EOF: do not forget the terminating NULL
                return state >= 1 ? buffer : NULL;   // must have at least 1 char
            }
            for (char *b=buf; *b!='\0'; b++) {
                switch(state) {
                    case 0:   // spaces before first uppercase
                        if (isblank(*b)) break;
                        state++;
                    case 1:   // first uppercase
                        if (! isupper(*b)) {
                            state = 5;    // must read up to \n
                            break;
                        }
                        state++;
                    case 2:   // process uppercase chars
                        if (! isupper(*b)) {
                            if (uppersize > 0) state++;
                            else  {
                                state = 5;    // must read up to \n
                                break;
                            }
                        }
                        else {
                            if (uppersize >= maxupper)  {
                                state = 5;    // must read up to \n
                                break;
                            }
                            *cur++ = *b;
                            uppersize++;
                            break;
                        }
                    case 3:   // process digit chars
                        if (! isdigit(*b)) {
                            state++;
                        }
                        else {
                            if (digitsize >= maxdigit)  {
                                state = 5;    // must read up to \n
                                break;
                            }
                            *cur++ = *b;
                            digitsize++;
                            break;
                        }
                    case 4:    // allow spaces after last digit
                        if ('\n' == *b) {
                            *cur = '\0';
                            return buffer;
                        }
                        if (! isspace(*b)) state++
                        break;
                    case 5:    // on error clean end of line
                        if ('\n' == *b) return NULL;
                }
            }
        }
    }
    
    ...
    printf("Enter flight code>\n");
    if (NULL == get_string(flight->flightcode, 2, 4, stdin)) {
        // process the error
        ...
    }
    ...
    
    #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;
    }