字符串输出C ++中的奇数字符

时间:2014-09-12 20:16:34

标签: c++ arrays string

我一直遇到这个奇怪的问题,这些字符出现在名为day[3]的char数组中。我的目标是使用计算机时钟并获取日期和时间。我将它放入一个名为dayHolder的字符串中,并希望将它添加到名为day的char数组中。但是当我这样做时,会得到许多奇怪的角色。我知道字符串应以' \ 0'结尾。但似乎不能让day只显示" Fri" ....

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <time.h>
#include <string>


using namespace std;

int main() {
    // Functions
    functions myFunc;

    //Variables + installations  
    string dayHolder;
    char day[3];
    char whitespace = ' ';
    time_t current = time(0);

    dayHolder = ctime(&current);


    for (int i = 0; i < 3; i++)
    {
        day[i] = dayHolder[i];
    }



    cout << ctime(&current) << endl;
    cout << dayHolder << endl;
    cout << day << endl;


    return 0;
}

enter image description here

那么我该怎么做才能解决这个问题呢?我确信它很简单,我忽略了所以任何建议或建议将不胜感激。

5 个答案:

答案 0 :(得分:3)

char day[3]不是零终止。

尝试

char day[4];

....

for (int i = 0; i < 3; i++)
{
    day[i] = dayHolder[i];
}
day[3] = 0; // or '\0' as @DeepBlackDwarf suggested

或者

string day = dayHolder.substr(0, 3);

答案 1 :(得分:2)

您必须在字符串的末尾添加一个额外的'\0'字符,即声明char day[4]并使用day[3] = '\0'指定最后一个字符。

答案 2 :(得分:2)

如前所述,您需要空终止。首先,您需要为null添加另一个字节。另一个选择是最初将缓冲区清零:

char day[4] = { 0 };

只要您不覆盖day[3],该值将保留0,并且字符串将保留为有效的c字符串。

答案 3 :(得分:1)

这是因为cout继续写入stdout,直到它遇到空终止符,因此是垃圾值。由于您使用的是C风格的字符串,因此您应该始终记住包含一个额外的空格以便终止字符串(例如,您要存储3个字符,因此缓冲区的大小应为4)。其他人已经提到你需要一个更大的缓冲区并在最后加上\0

答案 4 :(得分:1)

为什么不使用std::string,因为您已经包含string标题:

time_t current = time(0);
string dayHolder = ctime(&current);
string day(dayHolder.begin(), dayHolder.begin() + 3);

LIVE DEMO