日期转换程序中的奇怪错误

Tal*_*ete 2 c arrays string

我无法修复代码中的奇怪错误。

我编写了一个程序来打印最初以“MM/DD/YYYY”格式编写的日期,以格式化“Month DD, YYYY”。

该程序很简单:我将日期存储在数组中char,然后strtok分别获取月、日、年并将指向它们的指针存储在数组中char *。最终将代表月份的字符串部分转换为int ,从而将其作为打印月份的索引;日和年分别打印。

该程序可以工作,但我真的无法理解这样一个事实:如果我输入 08(八月)或 09(九月)作为月份,它就不会工作。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    void read_date( char * const);
    void collect_data( char * const, char *[] );
    int convert_month( char * );

    int main() {

         char *months[12] = {"January", "February", "March", "April", "May", "June", "July","August", "September", "October", "November", "December" };
         char orig_date[11];
         char *date_elem[3];

         int month;

         read_date( orig_date );

         collect_data( orig_date, date_elem );

         month = convert_month( date_elem[0] );

         puts("\n*New format*\n");
         printf( "%s %s, %s\n", months[month - 1], date_elem[1], date_elem[2]);

    }

    void read_date( char * const date ) {

         int i = 0;
         char c;

         puts("Enter date in format MM/DD/YYYY:\n");

         while ( i < 11 && ( c = getchar() ) != '\n' ) {

              date[i++] = c;
         }

         date[i] = '\0';
     }

     void collect_data( char * const date, char *elem[] ) {

          char *ptr;
          int i = 0;

          ptr = strtok( date, "/" );

          while ( ptr != NULL ) {

               elem[i++] = ptr;
               ptr = strtok( NULL, "/" );
          }

      }

      int convert_month( char *m ) {

           char *rem;

           return strtol( m, &rem, 0);

      }
Run Code Online (Sandbox Code Playgroud)

moo*_*eep 7

您使用基数 0 来解析月份部分的整数:

return strtol( m, &rem, 0);
Run Code Online (Sandbox Code Playgroud)

这意味着它将自动检测数字基数,假定零前缀输入数字采用基数 8(八进制)表示。您可能想要在那里硬编码基数 10 的用法。

数字0809不存在八进制数表示形式。您会在那里收到 0,因为它在遇到第一个无效字符时停止解析。请参阅下面的链接,了解如何使用 改进错误处理strtol()

以供参考: