我正在尝试用 C 语言编写一段代码,生成由 2 个字母组成的随机字符(aa、ab、ac、ad、ae ... za、zb、zc ... zz)。问题是如何将这些字符存储到数组中而不是将它们打印在屏幕上?
string key[] = {
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "X", "Y", "Z", "a","b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p","q", "r", "s", "t", "u", "v", "x", "y", "z"};
for(int i = 0; i < 50; i++)
{
for(int j = 0; j < 50; j++)
{
printf("%s%s\n", key[i], key[j]);
}
}
最佳答案
您似乎希望将两个字符的所有组合作为数组中的字符串。顺便说一句:这不是随机的。
解决方案可能如下所示:
int main(int argc, char *argv[]) {
string key[] = {
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
"V", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q",
"r", "s", "t", "u", "v", "x", "y", "z"};
//num is the number of elements in the array
int num = sizeof(key) / sizeof(key[0]);
//dynamically allocate memory for it
char *combi = malloc(num * num * (sizeof(char) * 3));
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
char *buf = combi + (i * num + j) * (sizeof(char) * 3);
sprintf(buf, "%s%s", key[i], key[j]);
}
}
//verify the result
int counter = 0;
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
char *combination = combi + (i * num + j) * (sizeof(char) * 3);
printf("[%d]: %s\n", counter++, combination);
}
}
//free the dynamically allocated memory
free(combi);
return 0;
}
输出
[0]: AA
[1]: AB
[2]: AC
...
[2498]: zy
[2499]: zz
说明
`combi'指向一个动态分配的 block ,大小为7500字节。然后,该内存块用于将两个字符的所有组合存储为字符串。
C 中的字符串意味着它以 NULL 结尾。
因此,每个条目有 3 个字节:两个字节表示 2 个字符,一个字节表示终止 NULL。
内存布局如下所示:
假设您想要访问第二个字符串,在我们的例子中是字符串“AB”:
您将使用指向名为 combi
的已分配内存的字符指针并添加 3。
char *secondString = combi + 3;
如果你现在想用 printf 输出这个字符串,请写
printf("%s\n", secondString);
并获得输出“AB”。顺便说一句:您还可以调用 printf 之外的任何需要字符串作为参数的函数。
使用嵌套循环时,我们必须将元素数量乘以外部索引变量的值,并加上内部索引变量的值以获得相应的数组索引。由于每个元素都有三个字节(两个字符和一个终止 NULL),因此必须将该数组索引乘以 3 才能获得指向字符串的相应指针。
关于c - 我有一些关于如何将生成的数据保存在新字符串中的 for 循环中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57537315/