【问题标题】:wrong result when converting multiple strings to integers in c. Atoi does not remove the old conversions在 c 中将多个字符串转换为整数时出现错误结果。 Atoi 不会删除旧的转换
【发布时间】:2021-11-23 12:31:48
【问题描述】:

我正在尝试从给我的日期中提取日期、月份和年份作为字符串。我在乞讨时将它们作为子字符串,然后我试图将它们转换为整数类型。第一个整数被成功提取,但第二个和第三个接收到错误的值。 Atoi 保留旧的转换值并将新值附加到它们

这是我的代码:

char day[2], month[2], year[4];
 strncpy(day, date, 2);
 strncpy(month, &date[3], 2);
 strncpy(year, &date[6], 4);

 int dayInt = atoi(day);
 int monthInt = atoi(month);
 int yearInt = atoi(year);

这些是存储在变量中的值:

【问题讨论】:

  • 您的数组大小不足以容纳终止的空字节。
  • 而且strncpy 在所有情况下都不会终止。
  • 在处理日期时考虑strptime。

标签: c string atoi


【解决方案1】:

您的字符串中没有终止空字节。

 char day[3], month[3], year[5];
 strncpy(day, date, 2);
 day[2] = '\0';
 strncpy(month, &date[3], 2);
 month[2] = '\0';
 strncpy(year, &date[6], 4);
 year[4] = '\0';

 int dayInt = atoi(day);
 int monthInt = atoi(month);
 int yearInt = atoi(year);

但您可以更简单地使用sscanf()。

sscanf(date, "%2d/%2d/%4d", &dayInt, &monthInt, &yearInt);

如有必要,请将格式字符串中的/ 替换为您的实际分隔符。

【讨论】:

    【解决方案2】:

    虽然您可以使用atoi 进行转换,但使用sscanf 会更简洁。更好的是使用strptime。

    #include <stdio.h>
    #include <time.h>
    
    int
    main(void)
    {
        char *date = "20210210";
        int day, month, year;
        struct tm tm = {0};
        char *end = "";
    
        if( sscanf(date, "%4d%2d%2d", &year, &month, &day) == 3 ){
            printf("year: %d, month: %d, day: %d\n", year, month, day);
        }
    
        end = strptime(date, "%Y%m%d", &tm);
        if( end != NULL ){
            year = tm.tm_year + 1900; /* tm_year is offset from 1900 */
            day = tm.tm_mday;
            month = tm.tm_mon + 1; /* tm_mon is 0 to 11 */
            printf("year: %d, month: %d, day: %d\n", year, month, day);
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多