鱼C论坛

 找回密码
 立即注册
查看: 769|回复: 3

[已解决]【C语言】

[复制链接]
发表于 2023-11-20 20:30:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想创建一个字符串数组,然后由用户来输入内容。
是我创建的方法错了吗还是哪个参数错了?
  1. #if(1)

  2. #include <stdio.h>

  3. double moni()
  4. {
  5.         int i;
  6.         int shijian;
  7.         char shijianming[][99] = {'\0'};
  8.         double gailv[99] = { 0 };
  9.         double gailvsum = 0;
  10.         printf("有几个事件?\n");
  11.         shijian = scanf_s("%d", &shijian);
  12.         for (;;)
  13.         {
  14.                 for (i = 0;i <= shijian;i++)
  15.                 {
  16.                         printf("输入第%d个事件是什么\n",i+1);
  17.                         shijianming[i][99] = scanf_s("%s", &shijianming[i]);//这里显示缓存区溢出
  18.                         printf("输入第%d个事件的概率\n",i+1);
  19.                         gailv[i] = scanf_s("%lf", &gailv[i]);
  20.                         gailvsum = gailvsum + gailv[i];
  21.                 }
  22.                 if (gailvsum != 1)
  23.                 {
  24.                         printf("输入的概率总和不为1,请重新输入\n");
  25.                         system("cls");
  26.                 }
  27.                 else
  28.                 {
  29.                         break;
  30.                 }
  31.         }

  32. }

  33. void main()
  34. {
  35.         int switch1 = 0;
  36.         printf("输入1进行模拟实验,输入2进入概率计算。\n");
  37.         switch1 = scanf_s("%d", &switch1);
  38.         if (switch1 == 1)
  39.         {
  40.                 moni();
  41.         }
  42. }
  43. #endif
复制代码
最佳答案
2023-11-20 20:33:11
您的代码中有几个问题需要进行修正:

1. 在定义 shijianming 数组时,应该指定第二维的大小。例如,可以使用 char shijianming[99][100] 来定义一个有99行、每行最多99个字符(加上字符串结尾符'\0')的二维字符数组。

2. 在输入事件个数时,无需将 shijian 传递给 scanf_s 函数,直接使用 scanf_s("%d", &shijian) 即可。

3. 在输入事件名称和概率时,无需对 shijianminggailv 进行 scanf_s,直接使用 scanf_s("%s", shijianming, 99)scanf_s("%lf", &gailv) 即可。

4. 在循环时,应该使用小于号 < 而不是小于等于号 <=,因为数组下标从0开始。

5. 在输入事件概率时,应该使用数组下标,即 gailv = scanf_s("%lf", &gailv) 应该改为 scanf_s("%lf", &gailv)

6. 在 main 函数中,无需将 switch1 再次传递给 scanf_s 函数,直接使用 scanf_s("%d", &switch1) 即可。

以下是已经修正的代码:
  1. #include <stdio.h>
  2. double moni() {
  3.     int i;
  4.     int shijian;
  5.     char shijianming[99][100] = {'\0'};
  6.     double gailv[99] = { 0 };
  7.     double gailvsum = 0;
  8.     printf("有几个事件?\n");
  9.     scanf_s("%d", &shijian);
  10.     for (;;) {
  11.         for (i = 0; i < shijian; i++) {
  12.             printf("输入第%d个事件是什么\n", i + 1);
  13.             scanf_s("%s", shijianming[i], 99);
  14.             printf("输入第%d个事件的概率\n", i + 1);
  15.             scanf_s("%lf", &gailv[i]);
  16.             gailvsum = gailvsum + gailv[i];
  17.         }
  18.         if (gailvsum != 1) {
  19.             printf("输入的概率总和不为1,请重新输入\n");
  20.             system("cls");
  21.         }
  22.         else {
  23.             break;
  24.         }
  25.     }
  26. }
  27. int main() {
  28.     int switch1 = 0;
  29.     printf("输入1进行模拟实验,输入2进入概率计算。\n");
  30.     scanf_s("%d", &switch1);
  31.     if (switch1 == 1) {
  32.         moni();
  33.     }
  34.     return 0;
  35. }
复制代码

希望以上修改能够帮助您解决问题,如还有疑问,请随时追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-20 20:30:20 | 显示全部楼层
你的代码存在一些问题。首先,你定义了一个字符串数组  shijianming ,但是你使用了错误的方式来接收用户输入。其次,你使用了  scanf_s  函数,但是没有正确处理返回值。最后, main  函数的返回类型应该是  int  而不是  void 。

以下是修改后的代码:

  1. #include <stdio.h>

  2. void moni()
  3. {
  4.     int i;
  5.     int shijian;
  6.     char shijianming[99][99]; // 修改为二维字符数组
  7.     double gailv[99] = {0};
  8.     double gailvsum = 0;

  9.     printf("有几个事件?\n");
  10.     scanf("%d", &shijian); // 移除了 scanf_s,并处理返回值

  11.     for (i = 0; i < shijian; i++) // 修改循环条件
  12.     {
  13.         printf("输入第%d个事件是什么\n", i + 1);
  14.         scanf("%s", shijianming[ i]); // 移除了 &,因为二维数组本身就是地址
  15.         printf("输入第%d个事件的概率\n", i + 1);
  16.         scanf("%lf", &gailv[ i]); // 处理返回值
  17.         gailvsum = gailvsum + gailv[ i];
  18.     }

  19.     while (gailvsum != 1) // 修改为 while 循环
  20.     {
  21.         printf("输入的概率总和不为1,请重新输入\n");
  22.         gailvsum = 0; // 重置 gailvsum
  23.         for (i = 0; i < shijian; i++)
  24.         {
  25.             gailvsum = gailvsum + gailv[ i];
  26.         }
  27.     }
  28. }

  29. int main()
  30. {
  31.     int switch1 = 0;
  32.     printf("输入1进行模拟实验,输入2进入概率计算。\n");
  33.     scanf("%d", &switch1); // 处理返回值
  34.     if (switch1 == 1)
  35.     {
  36.         moni();
  37.     }
  38.     return 0; // 返回 0 表示程序正常结束
  39. }
复制代码


这样修改后的代码应该能够实现你想要的功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-20 20:33:11 | 显示全部楼层    本楼为最佳答案   
您的代码中有几个问题需要进行修正:

1. 在定义 shijianming 数组时,应该指定第二维的大小。例如,可以使用 char shijianming[99][100] 来定义一个有99行、每行最多99个字符(加上字符串结尾符'\0')的二维字符数组。

2. 在输入事件个数时,无需将 shijian 传递给 scanf_s 函数,直接使用 scanf_s("%d", &shijian) 即可。

3. 在输入事件名称和概率时,无需对 shijianminggailv 进行 scanf_s,直接使用 scanf_s("%s", shijianming, 99)scanf_s("%lf", &gailv) 即可。

4. 在循环时,应该使用小于号 < 而不是小于等于号 <=,因为数组下标从0开始。

5. 在输入事件概率时,应该使用数组下标,即 gailv = scanf_s("%lf", &gailv) 应该改为 scanf_s("%lf", &gailv)

6. 在 main 函数中,无需将 switch1 再次传递给 scanf_s 函数,直接使用 scanf_s("%d", &switch1) 即可。

以下是已经修正的代码:
  1. #include <stdio.h>
  2. double moni() {
  3.     int i;
  4.     int shijian;
  5.     char shijianming[99][100] = {'\0'};
  6.     double gailv[99] = { 0 };
  7.     double gailvsum = 0;
  8.     printf("有几个事件?\n");
  9.     scanf_s("%d", &shijian);
  10.     for (;;) {
  11.         for (i = 0; i < shijian; i++) {
  12.             printf("输入第%d个事件是什么\n", i + 1);
  13.             scanf_s("%s", shijianming[i], 99);
  14.             printf("输入第%d个事件的概率\n", i + 1);
  15.             scanf_s("%lf", &gailv[i]);
  16.             gailvsum = gailvsum + gailv[i];
  17.         }
  18.         if (gailvsum != 1) {
  19.             printf("输入的概率总和不为1,请重新输入\n");
  20.             system("cls");
  21.         }
  22.         else {
  23.             break;
  24.         }
  25.     }
  26. }
  27. int main() {
  28.     int switch1 = 0;
  29.     printf("输入1进行模拟实验,输入2进入概率计算。\n");
  30.     scanf_s("%d", &switch1);
  31.     if (switch1 == 1) {
  32.         moni();
  33.     }
  34.     return 0;
  35. }
复制代码

希望以上修改能够帮助您解决问题,如还有疑问,请随时追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-20 20:34:39 | 显示全部楼层
isdkz 发表于 2023-11-20 20:30
你的代码存在一些问题。首先,你定义了一个字符串数组  shijianming ,但是你使用了错误的方式来接收用户输 ...
  1. scanf_s("%s", shijianming[i],99);
复制代码
这样才可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 05:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表