鱼C论坛

 找回密码
 立即注册
查看: 2086|回复: 25

[已解决]不清楚的错误类型......

[复制链接]
发表于 2019-8-8 16:51:22 | 显示全部楼层 |阅读模式

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

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

x
这个编译是没有问题的,可是在我刚输入完后就会弹出:“unhandled exception”,不知是哪里有错。
#include <stdio.h>
#include <conio.h>


void main()
{
        int i;
        char *name;
        struct person
        {
                int vote;
                char *name;
        } one ={0,"小甲鱼"}, two={0,"大"}, three={0,"小"}, four={0,"中"};
        printf("\n欢迎进入良好公民投票系统!:)\n");
        printf("\n本次的候选人有:小甲鱼、大、小、中\n");
        printf("\n一共可以投3票,请选出您心目中的最佳候选人吧!\n");
        for(i=0;i<3;i++)
        {
                printf("\n请输入第%d次投票结果:\n",i);
                scanf("%s",&name);
                if(*name=="小甲鱼")
                {
                        one.vote++;
                }
                else if(*name=="大")
                {
                        two.vote++;
                }
                else if(*name=="小")
                {
                        three.vote++;
                }
                else if(*name=="中")
                {
                        four.vote++;
                }
                else
                        continue;
        }
        printf("\n%s的的票数是:%d\n",one.name,one.vote);
        printf("\n%s的的票数是:%d\n",two.name,two.vote);
        printf("\n%s的的票数是:%d\n",three.name,three.vote);
        printf("\n%s的的票数是:%d\n",four.name,four.vote);
        getch();
}
希望能帮忙指正一下,谢谢。
最佳答案
2019-8-9 11:48:10
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>

  5. void main()
  6. {
  7.         int i;
  8.         char *name;
  9.         struct person
  10.         {
  11.                 int vote;
  12.                 char *name;
  13.         } one = {0, "小甲鱼"}, two = {0, "大"}, three = {0, "小"}, four = {0, "中"};
  14.         printf("\n欢迎进入良好公民投票系统!:)\n");
  15.         printf("\n本次的候选人有:小甲鱼、大、小、中\n");
  16.         printf("\n一共可以投3票,请选出您心目中的最佳候选人吧!\n");






  17.         name = malloc(1024);






  18.         for(i = 0; i < 3; i++)
  19.         {
  20.                 printf("\n请输入第%d次投票结果:\n", i);
  21.                 scanf("%s", name);
  22.                 if(strcmp(name, "小甲鱼") == 0)
  23.                 {
  24.                         one.vote++;
  25.                 }
  26.                 else if(strcmp(name, "大") == 0)
  27.                 {
  28.                         two.vote++;
  29.                 }
  30.                 else if(strcmp(name, "小") == 0)
  31.                 {
  32.                         three.vote++;
  33.                 }
  34.                 else if(strcmp(name, "中") == 0)
  35.                 {
  36.                         four.vote++;
  37.                 }
  38.                 else
  39.                         continue;
  40.         }
  41.         printf("\n%s的的票数是:%d\n", one.name, one.vote);
  42.         printf("\n%s的的票数是:%d\n", two.name, two.vote);
  43.         printf("\n%s的的票数是:%d\n", three.name, three.vote);
  44.         printf("\n%s的的票数是:%d\n", four.name, four.vote);
  45.         getch();
  46. }
复制代码

  1. 1>------ 已启动全部重新生成: 项目: C, 配置: Debug Win32 ------
  2. 1>main.c
  3. 1>C:\VisualStudioProjects\C\C\main.c(34,1): warning C4996:  'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
  4. 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\stdio.h(1274): message :  参见“scanf”的声明
  5. 1>C:\VisualStudioProjects\C\C\main.c(58,1): warning C4996:  'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.
  6. 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\conio.h(453): message :  参见“getch”的声明
  7. 1>C.vcxproj -> C:\VisualStudioProjects\C\Debug\C.exe
  8. 1>已完成生成项目“C.vcxproj”的操作。
  9. ========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-8 20:17:15 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <conio.h>


  3. int main(void)
  4. {
  5.         int i;
  6.         char name[10];
  7.         struct person
  8.         {
  9.                 int vote;
  10.                 char name[10];//[color=Blue][b]为啥要用指针呢?字符串长度要指定,不然一个字节是装不下的;[/b][/color]
  11.         } one ={0,"小甲鱼"}, two={0,"大"}, three={0,"小"}, four={0,"中"};
  12.         printf("\n欢迎进入良好公民投票系统!:)\n");
  13.         printf("\n本次的候选人有:小甲鱼、大、小、中\n");
  14.         printf("\n一共可以投3票,请选出您心目中的最佳候选人吧!\n");
  15.         for(i=1;i<4;++i)//[color=Blue]这里应该修改为这样[/color]
  16.         {
  17.                 printf("\n请输入第%d次投票结果:\n",i);
  18.                 scanf("%s",&name);
  19.                 if(name=="小甲鱼")
  20.                 {
  21.                         one.vote++;
  22.                 }
  23.                 else if(name=="大")
  24.                 {
  25.                         two.vote++;
  26.                 }
  27.                 else if(name=="小")
  28.                 {
  29.                         three.vote++;
  30.                 }
  31.                 else if(name=="中")
  32.                 {
  33.                         four.vote++;
  34.                 }
  35.                 else
  36.                         continue;
  37.         }
  38.         printf("\n%s的的票数是:%d\n",one.name,one.vote);
  39.         printf("\n%s的的票数是:%d\n",two.name,two.vote);
  40.         printf("\n%s的的票数是:%d\n",three.name,three.vote);
  41.         printf("\n%s的的票数是:%d\n",four.name,four.vote);
  42.         getch();
  43. }
复制代码


这样修改后,显示正常了。但是结构体内的数据无法改变。

这个程序应该使用链表就能顺利实现相应功能了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-9 09:15:14 | 显示全部楼层
用数组定义姓名那里明白了,但还是不太清楚为什么要写成 ++i 呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 09:23:20 | 显示全部楼层
1. scanf("%s", name),这里用 name 就好了,不用加 & ,因为name本身就是一个地址了,用指针跟用字符数组是一样的,
2. 字符串的比较不能用 == ,要用字符串比较函数strcmp(),上面的比较也不用*name,直接用name就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-9 09:35:20 | 显示全部楼层
东辰木 发表于 2019-8-9 09:23
1. scanf("%s", name),这里用 name 就好了,不用加 & ,因为name本身就是一个地址了,用指针跟用字符数组 ...

这样做还是会在输入后出现错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 10:26:43 | 显示全部楼层
编程小土豆 发表于 2019-8-9 09:15
用数组定义姓名那里明白了,但还是不太清楚为什么要写成 ++i 呢?

i++的表达式,意思是先运算++,然后运算i。而++i则反过来。虽然两个的结果都是一样的,但以++i不容易出BUG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 10:50:34 | 显示全部楼层
df3379 发表于 2019-8-9 10:26
i++的表达式,意思是先运算++,然后运算i。而++i则反过来。虽然两个的结果都是一样的,但以++i不容易出BU ...

反了吧,i++应该是先使用i,然后再进行自加操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 10:54:23 | 显示全部楼层
编程小土豆 发表于 2019-8-9 09:35
这样做还是会在输入后出现错误
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>

  4. void main()
  5. {
  6.         int i;
  7.         char *name;
  8.         struct person
  9.         {
  10.                 int vote;
  11.                 char *name;
  12.         } one ={0,"小甲鱼"}, two={0,"大"}, three={0,"小"}, four={0,"中"};
  13.         printf("\n欢迎进入良好公民投票系统!:)\n");
  14.         printf("\n本次的候选人有:小甲鱼、大、小、中\n");
  15.         printf("\n一共可以投3票,请选出您心目中的最佳候选人吧!\n");
  16.         for(i=0;i<3;i++)
  17.         {
  18.                 printf("\n请输入第%d次投票结果:\n",i);
  19.                 scanf("%s",name);
  20.                 if(strcmp(name,"小甲鱼") == 0)
  21.                 {
  22.                         one.vote++;
  23.                 }
  24.                 else if(strcmp(name,"大") == 0)
  25.                 {
  26.                         two.vote++;
  27.                 }
  28.                 else if(strcmp(name,"小") == 0)
  29.                 {
  30.                         three.vote++;
  31.                 }
  32.                 else if(strcmp(name,"中") == 0)
  33.                 {
  34.                         four.vote++;
  35.                 }
  36.                 else
  37.                         continue;
  38.         }
  39.         printf("\n%s的的票数是:%d\n",one.name,one.vote);
  40.         printf("\n%s的的票数是:%d\n",two.name,two.vote);
  41.         printf("\n%s的的票数是:%d\n",three.name,three.vote);
  42.         printf("\n%s的的票数是:%d\n",four.name,four.vote);
  43.         getch();
  44. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-9 11:00:32 | 显示全部楼层
df3379 发表于 2019-8-9 10:26
i++的表达式,意思是先运算++,然后运算i。而++i则反过来。虽然两个的结果都是一样的,但以++i不容易出BU ...

按照您的代码试了一遍,运行成功了,可是最后输出的结果票数都是零
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-9 11:27:22 | 显示全部楼层

"C:\Users\user\Desktop\捕获.PNG"
还是零呀......
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-9 11:28:27 | 显示全部楼层


                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 11:32:35 | 显示全部楼层
编程小土豆 发表于 2019-8-9 11:00
按照您的代码试了一遍,运行成功了,可是最后输出的结果票数都是零

我输出是正常的,看看你名字有没有输错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 11:44:27 | 显示全部楼层
  1. 1>------ 已启动全部重新生成: 项目: C, 配置: Debug Win32 ------
  2. 1>main.c
  3. 1>C:\VisualStudioProjects\C\C\main.c(20,1): warning C4996:  'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
  4. 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\stdio.h(1274): message :  参见“scanf”的声明
  5. 1>C:\VisualStudioProjects\C\C\main.c(44,1): warning C4996:  'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.
  6. 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\conio.h(453): message :  参见“getch”的声明
  7. 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\conio.h(453): message : C:\VisualStudioProjects\C\C\main.c(20) : warning C4700: 使用了未初始化的局部变量“name”
  8. 1>C.vcxproj -> C:\VisualStudioProjects\C\Debug\C.exe
  9. 1>已完成生成项目“C.vcxproj”的操作。
  10. ========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
复制代码



看这个
  1. 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\conio.h(453): message : C:\VisualStudioProjects\C\C\main.c(20) : warning C4700: 使用了未初始化的局部变量“name”
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 11:48:10 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>

  5. void main()
  6. {
  7.         int i;
  8.         char *name;
  9.         struct person
  10.         {
  11.                 int vote;
  12.                 char *name;
  13.         } one = {0, "小甲鱼"}, two = {0, "大"}, three = {0, "小"}, four = {0, "中"};
  14.         printf("\n欢迎进入良好公民投票系统!:)\n");
  15.         printf("\n本次的候选人有:小甲鱼、大、小、中\n");
  16.         printf("\n一共可以投3票,请选出您心目中的最佳候选人吧!\n");






  17.         name = malloc(1024);






  18.         for(i = 0; i < 3; i++)
  19.         {
  20.                 printf("\n请输入第%d次投票结果:\n", i);
  21.                 scanf("%s", name);
  22.                 if(strcmp(name, "小甲鱼") == 0)
  23.                 {
  24.                         one.vote++;
  25.                 }
  26.                 else if(strcmp(name, "大") == 0)
  27.                 {
  28.                         two.vote++;
  29.                 }
  30.                 else if(strcmp(name, "小") == 0)
  31.                 {
  32.                         three.vote++;
  33.                 }
  34.                 else if(strcmp(name, "中") == 0)
  35.                 {
  36.                         four.vote++;
  37.                 }
  38.                 else
  39.                         continue;
  40.         }
  41.         printf("\n%s的的票数是:%d\n", one.name, one.vote);
  42.         printf("\n%s的的票数是:%d\n", two.name, two.vote);
  43.         printf("\n%s的的票数是:%d\n", three.name, three.vote);
  44.         printf("\n%s的的票数是:%d\n", four.name, four.vote);
  45.         getch();
  46. }
复制代码

  1. 1>------ 已启动全部重新生成: 项目: C, 配置: Debug Win32 ------
  2. 1>main.c
  3. 1>C:\VisualStudioProjects\C\C\main.c(34,1): warning C4996:  'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
  4. 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\stdio.h(1274): message :  参见“scanf”的声明
  5. 1>C:\VisualStudioProjects\C\C\main.c(58,1): warning C4996:  'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.
  6. 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\conio.h(453): message :  参见“getch”的声明
  7. 1>C.vcxproj -> C:\VisualStudioProjects\C\Debug\C.exe
  8. 1>已完成生成项目“C.vcxproj”的操作。
  9. ========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-9 14:17:54 | 显示全部楼层

您提供的代码运行成功了,想问一下中间的name = malloc(1024)是什么含义?它好像不同于malloc的基本用法... 底下的第二段没有看懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 14:18:54 | 显示全部楼层
编程小土豆 发表于 2019-8-9 14:17
您提供的代码运行成功了,想问一下中间的name = malloc(1024)是什么含义?它好像不同于malloc的基本用法. ...

这就是malloc的基本用法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-9 14:19:27 | 显示全部楼层

还有为什么要引用<stdlib.h>呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 14:20:09 | 显示全部楼层
编程小土豆 发表于 2019-8-9 14:19
还有为什么要引用呢?

malloc函数在stdlib.h头文件中声明
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-9 14:25:08 | 显示全部楼层
人造人 发表于 2019-8-9 14:20
malloc函数在stdlib.h头文件中声明

哦,那这条语句就是对name进行了初始化(分配了空间),是这样吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 14:37:14 | 显示全部楼层
编程小土豆 发表于 2019-8-9 14:25
哦,那这条语句就是对name进行了初始化(分配了空间),是这样吧?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 22:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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