2014-09-12 75 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()功能只给出大写字母。如果你想要小写,你将需要更复杂一些。

此解决方案假定您知道编译时的初始字符串的大小。