鱼C论坛

 找回密码
 立即注册
查看: 1972|回复: 6

[已解决]c语言 scanf_s输入字符串报错

[复制链接]
发表于 2022-6-25 11:05:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 2740881635 于 2022-6-25 11:07 编辑
  1. #include<stdio.h>
  2. int main() {
  3.         int run[] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
  4.         int feirun[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  5.         char birthday[11], date[11];
  6.         int birth_year=0, birth_month=0, birth_day=0, date_year=0, date_month=0, date_day=0;
  7.         int D_value=0;
  8.         int all_life=0;
  9.         double f;

  10.         //printf("请输入你的生日(如1988-05-20):");
  11.         //scanf_s("%d-%d-%d", &birth_year,&birth_month,&birth_day);
  12.         //getchar();
  13.         //printf("请输入今年日期(如2016-03-28):");
  14.         //scanf_s("%d-%d-%d", &date_year, &date_month, &date_day);
  15.         printf("请输入你的生日(如1988-05-20):");
  16.         scanf_s("%s", birthday);                                      //问题一
  17.         getchar();
  18.         printf("请输入今年日期(如2016-03-28):");
  19.         scanf_s("%s", date);                                          //问题二
  20.         for (int i = 0; i < 10; i++) {
  21.                 if (i >= 0 && i <= 3) {
  22.                         birth_year = birth_year * 10 + (int)birthday[i] - 48;
  23.                         date_year = date_year * 10 + (int)date[i] - 48;
  24.                 }
  25.                 else if (i >= 5 && i <= 6) {
  26.                         birth_month = birth_month * 10 + (int)birthday[i] - 48;
  27.                         date_month = date_month * 10 + (int)date[i] - 48;
  28.                 }
  29.                 else if (i >= 8 && i <= 9) {
  30.                         birth_day = birth_day * 10 + (int)birthday[i] - 48;
  31.                         date_day = date_day * 10 + (int)date[i] - 48;
  32.                 }
  33.         }
  34.         for (int i=birth_year; i <= date_year-1; i++) {
  35.                 if (i % 4 == 0) {
  36.                         D_value += 366;
  37.                 }
  38.                 else {
  39.                         D_value += 365;
  40.                 }
  41.         }
  42.         if (birth_year % 4 == 0) {
  43.                 for (int j = 0; j < birth_month-1; j++) {
  44.                         D_value -= run[j];
  45.                 }
  46.         }
  47.         else {
  48.                 for (int j = 0; j < birth_month-1; j++) {
  49.                         D_value -= feirun[j];
  50.                 }
  51.         }
  52.         if (date_year % 4 == 0) {
  53.                 for (int j = 0; j < date_month-1; j++) {
  54.                         D_value += run[j];
  55.                 }
  56.         }
  57.         else {
  58.                 for (int j = 0; j < birth_month-1; j++) {
  59.                         D_value += feirun[j];
  60.                 }
  61.         }
  62.         D_value = D_value - birth_day + date_day;
  63.         for (int k = birth_year; k < birth_year + 80; k++) {
  64.                 if (k % 4 == 0) {
  65.                         all_life += 366;
  66.                 }
  67.                 else {
  68.                         all_life += 365;
  69.                 }
  70.         }
  71.         printf("你在这个世界上总共生存了%d天\n", D_value);
  72.         printf("如果能活到80岁,你还剩下%d天\n", all_life - D_value);
  73.         f = D_value / all_life;
  74.         printf("你已经使用了%.2f\%的生命,请好好珍惜剩下的时间!",f*100);

  75.         system("pause");
  76.         return 0;
  77. }
复制代码


代码为课后作业18动动手2的我的答案。
问题是我使用VS2022时,scanf_s("%s",birthday);
这一行在输入字符串后会出现错误信息:0x00007FF773F3459D 处有未经处理的异常(在 17.exe 中): 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出。

求求各位大佬解答,几个作业都遭遇到这个问题


最佳答案
2022-6-25 13:47:52
scanf_s函数少加了一个检查边界的参数
应当将scanf_s("%s", birthday);改成scanf_s("%s", birthday,sizeof(birthday));
将scanf_s("%s", date);改成scanf_s("%s", date,sizeof(date));
还有就是system函数需要引入#include <windows.h>
  1. #include <stdio.h>
  2. #include <windows.h>

  3. int main() {
  4.         int run[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  5.         int feirun[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  6.         char birthday[11], date[11];
  7.         int birth_year = 0, birth_month = 0, birth_day = 0, date_year = 0, date_month = 0, date_day = 0;
  8.         int D_value = 0;
  9.         int all_life = 0;
  10.         double f;

  11.         //printf("请输入你的生日(如1988-05-20):");
  12.         //scanf_s("%d-%d-%d", &birth_year,&birth_month,&birth_day);
  13.         //getchar();
  14.         //printf("请输入今年日期(如2016-03-28):");
  15.         //scanf_s("%d-%d-%d", &date_year, &date_month, &date_day);
  16.         printf("请输入你的生日(如1988-05-20):");
  17.         scanf_s("%s", birthday, sizeof(birthday));                                      //问题一
  18.         getchar();
  19.         printf("请输入今年日期(如2016-03-28):");
  20.         scanf_s("%s", date, sizeof(date));                                          //问题二
  21.         for (int i = 0; i < 10; i++) {
  22.                 if (i >= 0 && i <= 3) {
  23.                         birth_year = birth_year * 10 + (int)birthday[i] - 48;
  24.                         date_year = date_year * 10 + (int)date[i] - 48;
  25.                 }
  26.                 else if (i >= 5 && i <= 6) {
  27.                         birth_month = birth_month * 10 + (int)birthday[i] - 48;
  28.                         date_month = date_month * 10 + (int)date[i] - 48;
  29.                 }
  30.                 else if (i >= 8 && i <= 9) {
  31.                         birth_day = birth_day * 10 + (int)birthday[i] - 48;
  32.                         date_day = date_day * 10 + (int)date[i] - 48;
  33.                 }
  34.         }
  35.         for (int i = birth_year; i <= date_year - 1; i++) {
  36.                 if (i % 4 == 0) {
  37.                         D_value += 366;
  38.                 }
  39.                 else {
  40.                         D_value += 365;
  41.                 }
  42.         }
  43.         if (birth_year % 4 == 0) {
  44.                 for (int j = 0; j < birth_month - 1; j++) {
  45.                         D_value -= run[j];
  46.                 }
  47.         }
  48.         else {
  49.                 for (int j = 0; j < birth_month - 1; j++) {
  50.                         D_value -= feirun[j];
  51.                 }
  52.         }
  53.         if (date_year % 4 == 0) {
  54.                 for (int j = 0; j < date_month - 1; j++) {
  55.                         D_value += run[j];
  56.                 }
  57.         }
  58.         else {
  59.                 for (int j = 0; j < birth_month - 1; j++) {
  60.                         D_value += feirun[j];
  61.                 }
  62.         }
  63.         D_value = D_value - birth_day + date_day;
  64.         for (int k = birth_year; k < birth_year + 80; k++) {
  65.                 if (k % 4 == 0) {
  66.                         all_life += 366;
  67.                 }
  68.                 else {
  69.                         all_life += 365;
  70.                 }
  71.         }
  72.         printf("你在这个世界上总共生存了%d天\n", D_value);
  73.         printf("如果能活到80岁,你还剩下%d天\n", all_life - D_value);
  74.         f = D_value / all_life;
  75.         printf("你已经使用了%.2f的生命,请好好珍惜剩下的时间!", f * 100);

  76.         system("pause");
  77.         return 0;
  78. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-25 11:27:53 | 显示全部楼层
scanf_s("%s",birthday);  写成   scanf_s("%s",&birthday,sizeof(birthday));
scanf_s("%s", date);  写成   scanf_s("%s", &date,sizeof(date));
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 13:47:52 | 显示全部楼层    本楼为最佳答案   
scanf_s函数少加了一个检查边界的参数
应当将scanf_s("%s", birthday);改成scanf_s("%s", birthday,sizeof(birthday));
将scanf_s("%s", date);改成scanf_s("%s", date,sizeof(date));
还有就是system函数需要引入#include <windows.h>
  1. #include <stdio.h>
  2. #include <windows.h>

  3. int main() {
  4.         int run[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  5.         int feirun[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  6.         char birthday[11], date[11];
  7.         int birth_year = 0, birth_month = 0, birth_day = 0, date_year = 0, date_month = 0, date_day = 0;
  8.         int D_value = 0;
  9.         int all_life = 0;
  10.         double f;

  11.         //printf("请输入你的生日(如1988-05-20):");
  12.         //scanf_s("%d-%d-%d", &birth_year,&birth_month,&birth_day);
  13.         //getchar();
  14.         //printf("请输入今年日期(如2016-03-28):");
  15.         //scanf_s("%d-%d-%d", &date_year, &date_month, &date_day);
  16.         printf("请输入你的生日(如1988-05-20):");
  17.         scanf_s("%s", birthday, sizeof(birthday));                                      //问题一
  18.         getchar();
  19.         printf("请输入今年日期(如2016-03-28):");
  20.         scanf_s("%s", date, sizeof(date));                                          //问题二
  21.         for (int i = 0; i < 10; i++) {
  22.                 if (i >= 0 && i <= 3) {
  23.                         birth_year = birth_year * 10 + (int)birthday[i] - 48;
  24.                         date_year = date_year * 10 + (int)date[i] - 48;
  25.                 }
  26.                 else if (i >= 5 && i <= 6) {
  27.                         birth_month = birth_month * 10 + (int)birthday[i] - 48;
  28.                         date_month = date_month * 10 + (int)date[i] - 48;
  29.                 }
  30.                 else if (i >= 8 && i <= 9) {
  31.                         birth_day = birth_day * 10 + (int)birthday[i] - 48;
  32.                         date_day = date_day * 10 + (int)date[i] - 48;
  33.                 }
  34.         }
  35.         for (int i = birth_year; i <= date_year - 1; i++) {
  36.                 if (i % 4 == 0) {
  37.                         D_value += 366;
  38.                 }
  39.                 else {
  40.                         D_value += 365;
  41.                 }
  42.         }
  43.         if (birth_year % 4 == 0) {
  44.                 for (int j = 0; j < birth_month - 1; j++) {
  45.                         D_value -= run[j];
  46.                 }
  47.         }
  48.         else {
  49.                 for (int j = 0; j < birth_month - 1; j++) {
  50.                         D_value -= feirun[j];
  51.                 }
  52.         }
  53.         if (date_year % 4 == 0) {
  54.                 for (int j = 0; j < date_month - 1; j++) {
  55.                         D_value += run[j];
  56.                 }
  57.         }
  58.         else {
  59.                 for (int j = 0; j < birth_month - 1; j++) {
  60.                         D_value += feirun[j];
  61.                 }
  62.         }
  63.         D_value = D_value - birth_day + date_day;
  64.         for (int k = birth_year; k < birth_year + 80; k++) {
  65.                 if (k % 4 == 0) {
  66.                         all_life += 366;
  67.                 }
  68.                 else {
  69.                         all_life += 365;
  70.                 }
  71.         }
  72.         printf("你在这个世界上总共生存了%d天\n", D_value);
  73.         printf("如果能活到80岁,你还剩下%d天\n", all_life - D_value);
  74.         f = D_value / all_life;
  75.         printf("你已经使用了%.2f的生命,请好好珍惜剩下的时间!", f * 100);

  76.         system("pause");
  77.         return 0;
  78. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-6-25 13:59:58 | 显示全部楼层
临时号 发表于 2022-6-25 13:47
scanf_s函数少加了一个检查边界的参数
应当将scanf_s("%s", birthday);改成scanf_s("%s", birthday,sizeof ...

谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-25 14:01:17 | 显示全部楼层
loverinmydream 发表于 2022-6-25 11:27
scanf_s("%s",birthday);  写成   scanf_s("%s",&birthday,sizeof(birthday));
scanf_s("%s", date);  写 ...

谢谢大佬
应该不用加&吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-25 15:14:29 | 显示全部楼层
2740881635 发表于 2022-6-25 14:01
谢谢大佬
应该不用加&吧

这里可加可不加,因为数组传入函数本身传入的就是指针,没有必要用&取地址
如果问题解决了,不要忘了设置最佳答案哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-26 10:12:38 | 显示全部楼层
临时号 发表于 2022-6-25 15:14
这里可加可不加,因为数组传入函数本身传入的就是指针,没有必要用&取地址
如果问题解决了,不要忘了设置最 ...

的确,我没有注意到这是数组
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 01:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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