簡體   English   中英

在 c 中將多個字符串轉換為整數時出現錯誤結果。Atoi 不會刪除舊的轉換

[英]wrong result when converting multiple strings to integers in c. Atoi does not remove the old conversions

我正在嘗試從作為字符串給我的日期中提取日、月和年。 我在乞討時把它們當作 substring 然后我試圖將它們轉換為 integer 類型。 第一個 integer 成功提取,但第二個和第三個收到錯誤值。 Atoi 保留舊的轉換值和 append 的新值

這是我的代碼:

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

這些是存儲在變量中的值:

您的字符串中沒有終止 null 字節。

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

如有必要,請將格式字符串中的/替換為您的實際分隔符。

盡管您可以使用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM