我一直遇到这个奇怪的问题,这些字符出现在名为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(¤t);
for (int i = 0; i < 3; i++)
{
day[i] = dayHolder[i];
}
cout << ctime(¤t) << endl;
cout << dayHolder << endl;
cout << day << endl;
return 0;
}
那么我该怎么做才能解决这个问题呢?我确信它很简单,我忽略了所以任何建议或建议将不胜感激。
答案 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(¤t);
string day(dayHolder.begin(), dayHolder.begin() + 3);