1

我的代码是:

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 个字母 + 一些额外的随机符号。

4

4 回答 4

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;
}
于 2013-02-14T12:57:54.577 回答
0

正如其他人指出的那样,您不会以空值终止您的 char 数组。std::string如果您使用正确的 C++ 方式,即使用which 基本上是 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;
}
于 2013-02-14T13:11:17.973 回答
0

在 C 中,字符串以零结尾,这是因为字符串的长度与它无关,因此需要某种方法来确定字符串的结束位置。C 和 C++ 通过在字符串末尾放置一个零字符来做到这一点。当您执行诸如char* text = "simples";编译器之类的操作时,编译器会为您执行此操作,但是当您生成自己的字符串时,您需要在您感兴趣的字符之后再留出一个字符并将该字符设置为\0.

最后得到虚假字符的原因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,但我更喜欢的表现力\0——两者都会产生完全相同的效果)

零终止也是 C 和 C++ 中字符串处理速度慢的主要原因之一:几乎每个字符串操作都需要从头到尾扫描字符串以找到空终止符。

于 2013-02-14T13:12:34.383 回答
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) 为真的任何宇宙,则后者将在那里失败。

于 2013-02-14T12:58:58.387 回答