【问题标题】:Printing chars for a randomly generated string C/C++, Chars not in the random list are being also printed打印随机生成的字符串 C/C++ 的字符,同时打印不在随机列表中的字符
【发布时间】:2016-03-21 08:36:35
【问题描述】:

我正在尝试用 C++ 完成一些事情(请注意初学者),但我遇到了问题。我正在尝试生成一个带有大写/小写字母 a-z、数字和空格的随机字符串。正如您从代码中看到的那样,我创建了另一个包含这些符号的字符串,并使用rand() % size 为新字符串分配了一个随机字符。这里的问题是,在控制台上打印字符串时,我会看到其他符号,例如“?、!、-、=、。”和别的。这是为什么?

int fillRandomlyStr(char * str, unsigned len) {
    char symbols [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ";
    unsigned length = strlen(symbols);
    for (unsigned i = 0; i < len; i++) {
        str[i] = symbols[rand() % length];  
    }
    std::cout << "Отпечатване на низ със случайно генерирани символи: \n" << str << std::endl;
    //Printing a string with randomly generated chars
    return 0;
}

之前我做了类似的事情,用辅音替换字符串中的元音,效果很好。这里是:

int replaceVowels(char * str) {
    const char letters [] = "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ";
    unsigned len = strlen(str);
    for (unsigned i = 0; i < len; i++)
    {
        switch (str[i])
        {
            case 'a': str[i] = letters[rand() % 40];
            case 'A': str[i] = letters[rand() % 40];
            case 'o': str[i] = letters[rand() % 40];
            case 'O': str[i] = letters[rand() % 40];
            case 'e': str[i] = letters[rand() % 40];
            case 'E': str[i] = letters[rand() % 40];
            case 'i': str[i] = letters[rand() % 40];
            case 'I': str[i] = letters[rand() % 40];
            case 'y': str[i] = letters[rand() % 40];
            case 'Y': str[i] = letters[rand() % 40];
            case 'u': str[i] = letters[rand() % 40];
            case 'U': str[i] = letters[rand() % 40];
        }
    }
    std::cout << "Заменени всички гласни в низа с произволни съгласни: \n" << str << std::endl; //Printing it out
    return 0;
}

那么为什么在生成随机字符串的时候会出现这个问题呢?我将不胜感激。

【问题讨论】:

  • 由于缺少break,你的“元音替换器”替换了'a'十二次,'A'十一次,'o'十次,依此类推。

标签: c++ string random char


【解决方案1】:

你必须通过添加空字符来终止字符串。

int fillRandomlyStr(char * str, unsigned len) {
    char symbols [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ";
    unsigned length = strlen(symbols);
    for (unsigned i = 0; i < len; i++) {
        str[i] = symbols[rand() % length];

    }
    str[len] = '\0'; /* add this line */
    std::cout << "Отпечатване на низ със случайно генерирани символи: \n" << str << std::endl;
    //Printing a string with randomly generated chars
    return 0;
}

【讨论】:

  • 不敢相信我忘记了!我被警告说这是一个常见的错误。感谢您的帮助!
  • 如果分配的缓冲区大小是len那么你需要做str[len-1] = '\0'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2016-11-16
  • 1970-01-01
  • 2012-09-04
  • 2019-11-05
  • 2016-11-21
相关资源
最近更新 更多