2012-07-15 56 views

回答

2

您的問題是字符值0沒有映射到A.相反,這將將被打印成等於65.你可以看到滿桌here,如果你需要它的字符。

無論如何,代碼解決方案很簡單。取而代之的

cout<<letter[i]<<" "; 

你可以這樣做:

cout<<letter[i]+'A'-1<<" "; 

(是因爲你從1編號中的字母26代替鄰0至25 -1)。

+0

是的,沒有+ 1就沒問題了,這在這裏完全沒有必要。 – 2012-07-15 09:21:58

+0

我試過你的方法,它不給我有趣的性格,但它給我號碼65-90如何將它們顯示爲字母表? – newbieprogrammer 2012-07-15 11:28:54

+0

@ user1526669:沒有-1它會工作。目前,它將所有內容都轉換爲整數(將字符提升爲整數)。所以要麼刪除+ -1,要麼做cout <<(char)(letter [i] +'A'-1)<< ... – 2012-07-15 11:31:32

7

C++中「如何洗牌」的答案是使用標準庫的混洗算法之一。一個簡單的方法來做到這將是把它放在一個std::string,並使用std::random_shuffle

std::string s = "abcdef ...." ; 
std::random_shuffle(s.begin(), s.end()); 

你也可以用數組做到這一點:

char letters[] = {'a', 'b', ..... }; 
std::random_shuffle(letters, letters+26); 
+0

通過使用這種方法,洗牌是固定的嗎? 我希望程序在不重複的情況下生成不同的洗牌。 – newbieprogrammer 2012-07-15 10:53:10

+0

@ user1526669它會被修復,但是你可以用於生成隨機數字的種子,所以每次運行程序時都可以使用類似日期或其他的東西來產生不同的密鑰。文檔[這裏](http://en.cppreference.com/w/cpp/algorithm/random_shuffle)應該給出更多的線索。 – juanchopanza 2012-07-15 11:45:04

0
const char chars[] = "abcdef ...."; 
char result[...]; 
memcpy(result, chars, sizeof(chars)); 
for (unsigned i = 0; i < (sizeof(chars)-1); ++i) { 
    unsigned j = rand() % sizeof(chars); 
    char tmp = result[j]; 
    result[j] = result[i]; 
    result[i] = tmp; 
} 

如果你使用STL,那麼std :: random_shuffle是首選。

相關問題