在我的数组中突然出现额外的索引值

时间:2013-02-14 12:54:48

标签: c++ arrays

我的代码是:

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 个答案:

答案 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 ++中字符串处理速度慢的原因之一:几乎每个字符串操作都需要从头到尾扫描字符串以找到空终止符。