2014-09-12 115 views
0

我不断收到这个奇怪的问题,这些字符出现在我的char数组中,名字为day[3]。我的目标是使用计算机时钟并获取日期和时间。我把它放到一个名为dayHolder的字符串中,并且只想将它添加到名为day的char数组中。但是当我这样做的时候会得到很多奇怪的字符。据我所知,该字符串应该用“\ 0”结束,但不能似乎得到day只是显示“星期五” ......字符串输出中的奇数字符C++

#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

所以我能做些什么来解决这个问题?我相信它的一些简单的东西,我忽略了,所以任何意见或建议,将不胜感激谢谢。

+4

你错过了上串空终止。 – Barmar 2014-09-12 20:18:25

+2

既然你明白这个字符串必须是null结尾的。那你为什么不'char day [4] ... day [3] ='\ 0';'? – 101010 2014-09-12 20:18:52

回答

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

嘿,哇,工作!我会在发布后查找它,但我认为char数组从0开始。因此,在Fri 0 = F,1 = r,2 = i,3 = null(即\ 0)的情况下。是如何使阵列4的内存解决这个问题? – 2014-09-12 20:29:57

+1

没有'3'。 'day [3]'声明一个数组或三个元素,索引为'0','1','2'。另外,数组默认情况下未初始化(但请参阅** fbrereto **的答案)。 – AlexD 2014-09-12 20:32:23

+0

啊,我明白了,谢谢。 :) – 2014-09-12 20:39:49

2

你必须在字符串末尾添加一个额外的'\0'字符,即宣布char day[4]day[3] = '\0'分配最后一个字符。

2

如上所述,您需要空终止。首先,您需要为空值添加另一个字节。另一种选择是零出最初的缓冲:只要

char day[4] = { 0 }; 

,你不要覆盖day[3]该值将留0和字符串将保持一个有效的C弦。

+0

除了他们写入3个字符,所以除非缓冲区较大,否则您将不会有终止空字符。 – 2014-09-12 20:23:42

+1

还有一个空终止符:'char day [4] = {0}' – Void 2014-09-12 20:24:28

+0

@Void注意,谢谢。 – fbrereto 2014-09-12 20:24:50

1

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

+0

很高兴知道谢谢。 – 2014-09-12 20:33:16

1

你为什么不使用std::string,因为你已经列入string头:

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

LIVE DEMO