我的代码是:
char randomChar(int randMax) {
return (65 + rand() % randMax);
}
int main() {
srand(time(NULL));
const int SIZE = 4;
const int LETTERS = 6;
char code[SIZE];
for (int i = 0; i < SIZE; i++) {
code[i] = randomChar(LETTERS);
}
cout << code;
return 0;
}
问题在于,即使我将代码数组设置为长度为4,randomChar
函数也会返回4个字母+一些额外的随机符号。
答案 0 :(得分:2)
您应该在数组中放置一个终止零字符。否则,您可能会在阵列结束后打印垃圾。始终声明数组的大小比您需要的大1,然后将最后一个元素设置为0。
试试这段代码:
char randomChar(int randMax) {
return (65 + rand() % randMax);
}
int main() {
srand(time(NULL));
const int SIZE = 4;
const int LETTERS = 6;
char code[SIZE + 1];
for (int i = 0; i < SIZE; i++) {
code[i] = randomChar(LETTERS);
}
code[SIZE] = 0; // or '\0'
cout << code;
return 0;
}
答案 1 :(得分:0)
你的字符串不是零终止。
你可能必须这样做:
char randomChar(int randMax) {
return (65 + rand() % randMax);
}
int main() {
srand(time(NULL));
const int SIZE = 4;
const int LETTERS = 6;
char code[SIZE + 1];
for (int i = 0; i < SIZE; i++) {
code[i] = randomChar(LETTERS);
}
code[SIZE] = '\0';
cout << code;
return 0;
}
或者,根据评论者@borisbn的建议:
char randomChar(int randMax) {
return (65 + rand() % randMax);
}
int main() {
srand(time(NULL));
const int SIZE = 4;
const int LETTERS = 6;
char code[SIZE + 1] = {0};
for (int i = 0; i < SIZE; i++) {
code[i] = randomChar(LETTERS);
}
cout << code;
return 0;
}
但是如果有任何宇宙('\ 0'!= 0)为真,那么后者就会失败。
答案 2 :(得分:0)
正如其他人指出的那样,你不是在终止你的char数组。如果使用正确的C ++方式,即使用std::string
,它基本上是char数组的包装类,你可以忘记这类问题。以下是如何在C ++中实现相同的逻辑:
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <string>
char randomChar(const int randMax) // suggestion, not a necessity: mark randMax as const since you never intend to modify it here.
{
return ( 65 + std::rand() % randMax );
}
int main()
{
std::srand(std::time(NULL));
const int SIZE = 4;
const int LETTERS = 6;
std::string code;
for (int i = 0; i < SIZE; i++)
{
code.insert(code.end(), randomChar(LETTERS));
}
std::cout << code << std::endl;
return 0;
}
答案 3 :(得分:0)
在C中,字符串是零终止的,这是因为字符串的长度与它没有关联,所以需要某种方法来确定字符串结束的位置。 C和C ++通过在字符串末尾放置一个零字符来完成此操作。当您执行char* text = "simples";
之类的操作时,编译器会为您执行此操作,但是当您生成自己的字符串时,您需要在您感兴趣的字符之后留出一个空格,并将此字符设置为{{ 1}}。
你最后得到假字符的原因是\0
尽职尽责地打印出从你的数组开始的字符,直到它碰到一个零字节,它将被解释为字符串的结尾。 / p>
因此,您希望将cout
函数替换为:
main()
(你也可以做int main() {
srand(time(NULL));
const int SIZE = 4;
const int LETTERS = 6;
char code[SIZE + 1];
for (int i = 0; i < SIZE; i++) {
code[i] = randomChar(LETTERS);
}
// Need to zero-terminate the string
code[SIZE] = '\0';
cout << code;
return 0;
}
但我更喜欢code[SIZE] = 0
的表现力 - 两者都会产生完全相同的效果)
零终止也是C和C ++中字符串处理速度慢的原因之一:几乎每个字符串操作都需要从头到尾扫描字符串以找到空终止符。