c - 我有一些关于如何将生成的数据保存在新字符串中的 for 循环中的问题

标签 c string cs50

我正在尝试用 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。

内存布局如下所示:

memory layout

假设您想要访问第二个字符串,在我们的例子中是字符串“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/

相关文章:

c - socket sendto在udp数据包期间得到错误22

c++ - 在保持容量的同时重置字符串

c++ - 将 GetLastError() 转换为带有错误字符串的异常

c - 有符号整数溢出 : 999999999 * 10 cannot be represented in type 'int' Error

c - 在 C 中 - 循环内递增的变量不保留值 CS50

c - 在通过使用 16 位算术评估一个系列来计算 π 时避免溢出?

c - 如何处理对已调整大小的哈希表的旧引用?

c - 在连接到服务器之前尝试编译客户端时出错

string - 带有元字符的 R 中的 strsplit

c - 使用 C 语言使用 Coleman-Liau 索引找出可读性级别