【问题标题】:Converting a char array to an int value by using atoi in C++在 C++ 中使用 atoi 将 char 数组转换为 int 值
【发布时间】:2021-04-14 23:55:49
【问题描述】:

我对 C++ 编码很陌生,我现在面临一个问题。我需要编写一个以 DD.MM.YYYY 格式接收生日(字符串)作为参数的函数。然后我需要提取日期、月份和年份,并使用 atoi() 函数将它们保存在一个 int 数组中。 我的代码中的问题是,当我使用 atoi 获取日期和月份时,我得到了 0 作为值,但是在尝试将年份作为 int 值时,我得到了正确的值。谁能告诉我我做错了什么?

谢谢

#include <iostream>
#include <cstdlib>

using std::cout, std::cin, std::string;

int * extractDate(string birthday)  //Birthday format: DD.MM.YYYY
{
    // Extraction of DD
    char dayArr[2] = {birthday[0], birthday[1]};
    dayArr[2] = '\0';
    // Extraction of MM
    char monthArr[2] = {birthday[3], birthday[4]};
    monthArr[2] = '\0';
    // Extraction of YYYY
    char yearArr[4] = {birthday[6], birthday[7], birthday[8], birthday[9]};
    yearArr[4] = '\0';
    // Int-Array to save the data as numbers
    int * birthdayArr = new int[3];

    // Converting and saving the data to integers
    birthdayArr[0] = atoi(dayArr);    // Here I get 0
    birthdayArr[1] = atoi(monthArr);  // Here I get 0 as well
    birthdayArr[2] = atoi(yearArr);   // Here I get the year correctly
    birthdayArr[3] = '\0';

    return birthdayArr;
}

【问题讨论】:

  • 没有dayArr[2]。该数组只有 2 个元素,dayArr[0]dayArr[1]
  • dayArr 有两个元素,dayArr[0]dayArr[1]。但是dayArr[2] 已经结束了,分配给它会导致未定义的行为。
  • 为什么必须使用 atoi() 而不是采用 std::string 的 C++ 函数?
  • 是的,您确实需要自己终止阵列。但是您还需要声明足够大的数组以容纳终止符。
  • 他们教得很好,不用担心 -- 如果这是他们如何教授 C++ 的一个例子,那就有担心了。

标签: c++ arrays string


【解决方案1】:

您需要声明足够大的数组以容纳空终止符。您正在数组外写入空字节。

    char dayArr[3] = {birthday[0], birthday[1], '\0'};

对于其他两个数组也是如此。

【讨论】:

    【解决方案2】:

    当您尝试将数组的最后一个元素设置为“\0”时,您正在写超出数组的末尾。由于 dayArr 的长度为 2,它的有效索引只有 0 和 1——当您尝试写入 dayArr[2] 时,您实际上是在写入内存中它之后的任何内容,这(通常)是下一个变量你在函数中声明。

    如果您将数组的大小每个增加 1,它们应该可以工作。

    【讨论】:

    • 关闭,但不完全。请记住,在 C++(和 C)中,数组从 0 开始索引,因此当 dayArr 包含 3 个元素时,这些元素的编号为 0、1、2。因此,要获取 dayArr 的最后一个元素,您可以使用 dayArr[2]
    • 是的,我忘记了。谢谢
    • @Xhuliano 请不要更改问题中的代码以应用答案中建议的更正!这会使您的问题和现有答案对于与您有相同问题的未来访问者毫无用处。泰。
    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2015-01-11
    相关资源
    最近更新 更多