我无法修复代码中的奇怪错误。
我编写了一个程序来打印最初以“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)
您使用基数 0 来解析月份部分的整数:
return strtol( m, &rem, 0);
Run Code Online (Sandbox Code Playgroud)
这意味着它将自动检测数字基数,假定零前缀输入数字采用基数 8(八进制)表示。您可能想要在那里硬编码基数 10 的用法。
数字08和09不存在八进制数表示形式。您会在那里收到 0,因为它在遇到第一个无效字符时停止解析。请参阅下面的链接,了解如何使用 改进错误处理strtol()。
以供参考:
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |