2012-07-15 60 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是首选。

相关问题