我被赋予了生成随机80字节密钥的任务,我已经决定了以下策略
在我的电脑sizeof(char)=1
中,所以我创建了一系列英文字母
char *p=" ";
char a[0..26] and in cycle
for (int i=0;i<=80;i++){
*(p+i)+= a[(rand()+100) % 26];
}
但它不起作用它停止执行请帮助对不起,如果我的代码是愚蠢但我不能在这个时候想 谢谢 代码
#include <iostream>
#include <string.h>
#include <cstdlib>
using namespace std;
int main(){
char *p=" ";
char a[]= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
for (int i=0;i<=80;i++){
*(p+i)+=(a[(rand()+100)%26]);
}
cout<<p<<endl;
return 0;
}
答案 0 :(得分:3)
好吧,通常我会说你需要提供比“它停止执行”更多的信息,但是有些事情突然发生在我身上:
char *p=" ";
char a[]= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
for (int i=0;i<=80;i++){
*(p+i)+=(a[(rand()+100)%26]);
}
你的循环是将值从索引0写入*p
到80(总共81个元素)。
第一次迭代迭代:
*(p+0) = a[...];
会起作用,但第二个
*(p+1) = a[...];
应该失败,因为地址*(p + 1)没有保留内存。如果您可以写入为字符串文字附加的空\0
保留的空间,则可以将其关闭。
当您声明* p为
时char *p=" ";
你只分配1个字节。所以,当你的循环写入p [1]时,p [2] ......你正在尝试写入未分配的内存。将您的声明更改为
char pArr[81];
char *p=pArr;
从那里开始。
答案 1 :(得分:2)
试试这个:
#include <iostream>
#include <string.h>
#include <cstdlib>
using namespace std;
int main(){
// ensure the target has enough memory for the key and a null terminator
char p[81];
// this string will do as nicely as the character array
char a[] = "abcdefghijklmnopqrstuvwxyz";
// no += here. I assign the random character directly to the target buffer
for (int i=0;i<=80;i++)
p[i] = a[rand()%26];
// alternately, you can calculate a random English character with:
// p[i] = rand()%26 + 'a';
// which removes the need for the a[] buffer at all
// don't forget to null-terminate
p[80] = '\0'
// output results
cout<<p<<endl;
return 0;
}
答案 2 :(得分:1)
答案 3 :(得分:1)
您正在p
变量中分配字符,但尚未分配内存来分配这些字符。你可能想要这样的东西:
char p[81];
然后从那里开始。
答案 4 :(得分:1)
我修改了你的代码......试一试。
#include <iostream>
#include <string.h>
#include <cstdlib>
using namespace std;
int main(){
char *p= new char[81];
char a[]= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
for (int i=0;i<=80;i++){
*(p+i)=(a[(rand()+100)%26]);
}
cout<<p<<endl;
return 0;
}
那么输出是什么?
答案 5 :(得分:1)
关于此代码的问题:
为什么要生成一个字母字符数组?为什么不随机调制,调制26,并将偏移量添加到ASCII“a”?这节省了内存分配,在我看来更清楚。
答案 6 :(得分:0)
为了完整性:
std::vector<char> BuildKey(std::size_t keyLength)
{
const char elements[] = "abcdefg0123!@_";
const std::size_t numElements = sizeof(elements) / sizeof(char);
//division technically superfluous, as sizeof(char) == 1, but in general its needed.
std::vector<char> key;
key.reserve(keyLength);
for(std::size_t i = 0; i < keyLength; ++i)
key.push_back(elements[rand()%numElements]);
//there are a handful of ways using standard algorithms to achieve this,
// but I'm largely unconvinced the added complexity is justified for simple loops
return key;
}
还可以进行一些更改。我可能会对rand
进行参数化,以便我可以稍后选择我的PRNG,并可能提供elements
数组作为输入。 string
可能比vector
更合适,具体取决于您计划如何使用密钥。或者只是接受ForwardIterator,然后返回void
。很多选择。