2014-09-12 49 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