c - C 语言的交互式随机程序

标签 c arrays pointers random

我的这个程序的目标是将用户的输入合并到一种交互式/随机的故事中,但我不确定如何从用户那里获取输入以适应 *ptrDescription 之间的输入。 , *ptrBeginning , *ptrMiddle ,和*ptrEnd 。任何帮助将非常非常感谢!

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include <string.h>
#include <ctype.h>

int main(void){

    int i;
    char name[20];
    char color[20];
    int age;
    char sentence[1];
    //array of pointers to char arrays
    char *ptrDescription[]={"the painfully handsome","the one and only","who seemed much older than"};
    char *ptrBeginning[]={"was blissfully ignoring","could clearly see","had no idea"};
    char *ptrMiddle[]={"the huge truck","the falling meteor","the bucket of milk","the mailman","the most powerful wizard"};
    char *ptrEnd[]={"that was barreling toward them.","on the horizon."};

    srand(time(NULL));

    printf("Enter your first name: ");
    scanf("%s", &name);
    printf("\nEnter your age: ");
    scanf("%d", &age);
    printf("\nEnter your favorite color: ");
    scanf("%s", &color);


    for (i = 0; i < 1; i++)
    {
        //strcpy(sentence,ptrDescription[rand()%3]);
        //strcat(sentence," ");
        //strcat(sentence,ptrBeginning[rand()%3]);
        //strcat(sentence," ");
        //strcat(sentence,ptrMiddle[rand()%5]);
        //strcat(sentence," ");
        //strcat(sentence,ptrEnd[rand()%2]);
        //strcat(sentence,".");
        //sentence[0]=toupper(sentence[0]);

        puts(sentence);
    }

    getch();
    return 0;
}

编辑:

我编辑了代码的一部分,以便直接遵循 for (i = 0; i < 1; i++)现在看起来像这样:

snprintf(sentence, sizeof sentence,"%s, %s %d year old, %s %s %s %s", name, ptrDescription[rand()%3], age,ptrBeginning[rand()%3], ptrMiddle[rand()%5], ptrEnd[rand()%2]);

输出中的句子后面有大量奇怪的字符,比如日语字符之类的。但我不确定他们为什么在那里。这就是它的样子:

“输入您的名字:贾斯汀

输入您的年龄:20 贾斯汀,这个傲慢的二十岁少年,故意无视向他们冲来的最强大的巫师。汽$0HβHze(テフフフフフフフフフフフフフH・(DキHH広$0陏&・汽$0タHze(テフフフフフフフフフフフフフフフH WH・ H栉H・t9HνHテ<"

有人知道我怎样才能摆脱它们吗?

最佳答案

如果您已经有了姓名和年龄,只需将它们插入到句子中的正确位置即可,对吗?所以 strcat(sentence, name) 适用于 name。 age 有点棘手,因为您必须先格式化数字,而 strcat 不会为您做这件事。一种解决方案是使用 sprintf(buf, "%d",age) ,然后连接 buf (这是您必须声明的临时字符数组)。

任何时候在 C 中处理字符串时,都必须关心目标缓冲区中有足够的空间。您的程序在输入和输出期间都可能会耗尽空间。对于输出,我会完全删除sentence;因为您最终只是写入标准输出,所以我会在您进行过程中打印每个部分。对于读取,scanf 支持向格式字符串添加长度参数。

如果您使用 *printf 函数之一,则必须注意两件事:

  1. 您传递的参数对于您使用的格式字符串是正确的
  2. 您的缓冲区最终以 null 终止

您当前的问题在于#1 - 您的格式字符串 promise 遵循 7 个参数,但您只提供 6 个。snprintf 从堆栈中获取“随机”第 7 个值,将其解释为 char指针,并将其找到的任何内容复制到sentence。如果您的格式字符串 promise 使用 char 指针,但您在给定位置放置了 int,您可能会遇到类似的问题。在这种情况下,格式字符串是一个常量,因此智能编译器可以验证您的格式字符串是否与后续参数匹配。您需要养成认真对待编译器警告而不是忽略它们的习惯。

如果您的句子最终大于句子缓冲区,那么第二点可能会成为问题。如果没有空终止符的空间,则不会应用空终止符。您可以检查 snprintf 的返回值,或者您可以防御性地始终将 0 写入到最后一个数组位置。

关于c - C 语言的交互式随机程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898790/

相关文章:

c++ - 向数组移动和添加元素

python - 在 Numpy 中创建 cos 和 sin 数组的最有效方法

c++ - 编程原理与实践第27章侵入式列表错误?

c - 未在指针给定的地址处显示正确的值

CGI 程序在curl_easy_init() 上崩溃

c - SDL 内存泄漏

c - 在 C 中从 .ELF 文件读取一个段时出现问题

c - 在 C 代码中获取 valgrind 错误

javascript - 在 Javascript 中将两个名称/值数组加载到一个新对象

在记录类型之间分配字符串时出现 Delphi 访问冲突错误