2014-09-12 93 views
-3

我試圖生成一個隨機的字符是這樣的:C++隨機字符

char* test = "myname" + GenerateRandomChar(); 

我試圖做到這一點,而不使用字符串。所以請不要說使用字符串。由於

+6

那麼你遇到問題的哪個部分?生成一個隨機角色?連接它? – chris 2014-09-12 19:06:22

+4

使用[標準庫](http://en.cppreference.com/w/cpp)提供給您的功能將使您的生活如同C++程序員一樣容易。使用它們! – 2014-09-12 19:06:27

回答

5

如果你正在編寫C代碼(這看來你是),然後做

char buff[8]; //sizeof("myname") + 1 + 1 
sprintf(buff,"myname%c", GenerateRandomChar()); 

我假設GenerateRandomChar存在和工作

1

嘗試是這樣的:

char[] test = "myname\0"; // note char[] instead of char* 
test[6] = GenerateRandomChar(); 

char GenerateRandomChar() 
{ 
    return (char) (random(127-33) + 33); 
} 
0

,因爲它代表你的代碼是不正確的原因有兩個:

  1. 你執行棄用轉換從const char*char*。它不應該編譯。
  2. 您正在執行指針算術,而不是連接。

下面的表達式:

"myname" + c 

c哪裏是一些char不進行級聯,而是指針運算。

char *ptr = "myname"; 
char c = ' '; // ASCII equivalent is 32 
int n = (int) c; 
char *s = ptr + n; // s now points out of bounds of ptr 

如果你堅持做C風格的代碼,那麼你就需要使用標準庫函數strcpy,並可能strcat:到這是相似的。例如:

#include <cstdlib> 
#include <cstring> 
#include <iostream> 

char foo() { 
    // return a random character here 
} 

int main() { 
    const char* myname = "myname"; 
    // enough room to contain new character 
    // and null terminator 
    char* buffer = new char[strlen(myname) + 2]; 
    // strcpy includes the null terminator 
    strcpy(buffer, myname); 
    // We overwrite myname's null terminator 
    buffer[strlen(myname)] = foo(); 
    buffer[strlen(myname) + 1] = '\0'; 
    std::cout << buffer; 
    delete[] buffer; 
} 
+0

嚴格地說 - 這個問題被標記爲C++,並且在C++中這是不被允許的。在C gcc給你一個警告,你正在做一件壞事 – pm100 2014-09-12 19:20:29

+0

@ pm100什麼是不允許的?從const char *到char *的轉換這就是爲什麼我說它不會在評論中彙編。 – 2014-09-12 19:21:28

+0

「foo」+ c在C++中是不允許的。 – pm100 2014-09-15 16:01:10

1

您可以將的sizeof添加到緩衝區,所以它是獨立焦化長度爲:

#include <cstdio> 
#include <iostream> 

char getRandomChar(){ 
    static char c = 'A' + rand()%24; 
    return c;  
    } 

int main() 
{ 
    srand((unsigned)time(0)); 
    char str[] = "test"; 
    char buffer[sizeof(str)+1]; 
    char rnd = getRandomChar(); 
    sprintf(buffer, "%s%c",str,rnd); 
    std::cout << buffer << std::endl; 
} 

注意,getRandomChar()功能只給出大寫字母。如果你想要小寫,你將需要更復雜一些。

此解決方案假定您知道編譯時的初始字符串的大小。