鱼C论坛

 找回密码
 立即注册
查看: 1546|回复: 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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.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");






        name = malloc(1024);






        for(i = 0; i < 3; i++)
        {
                printf("\n请输入第%d次投票结果:\n", i);
                scanf("%s", name);
                if(strcmp(name, "小甲鱼") == 0)
                {
                        one.vote++;
                }
                else if(strcmp(name, "大") == 0)
                {
                        two.vote++;
                }
                else if(strcmp(name, "小") == 0)
                {
                        three.vote++;
                }
                else if(strcmp(name, "中") == 0)
                {
                        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();
}
1>------ 已启动全部重新生成: 项目: C, 配置: Debug Win32 ------
1>main.c
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.
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\stdio.h(1274): message :  参见“scanf”的声明
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.
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\conio.h(453): message :  参见“getch”的声明
1>C.vcxproj -> C:\VisualStudioProjects\C\Debug\C.exe
1>已完成生成项目“C.vcxproj”的操作。
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


int main(void)
{
        int i;
        char name[10];
        struct person
        {
                int vote;
                char name[10];//[b]为啥要用指针呢?字符串长度要指定,不然一个字节是装不下的;[/b]
        } one ={0,"小甲鱼"}, two={0,"大"}, three={0,"小"}, four={0,"中"};
        printf("\n欢迎进入良好公民投票系统!:)\n");
        printf("\n本次的候选人有:小甲鱼、大、小、中\n");
        printf("\n一共可以投3票,请选出您心目中的最佳候选人吧!\n");
        for(i=1;i<4;++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();
}

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

这个程序应该使用链表就能顺利实现相应功能了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

这样做还是会在输入后出现错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

i++的表达式,意思是先运算++,然后运算i。而++i则反过来。虽然两个的结果都是一样的,但以++i不容易出BUG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

反了吧,i++应该是先使用i,然后再进行自加操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 10:54:23 | 显示全部楼层
编程小土豆 发表于 2019-8-9 09:35
这样做还是会在输入后出现错误
#include <stdio.h>
#include <conio.h>
#include <string.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(strcmp(name,"小甲鱼") == 0)
                {
                        one.vote++;
                }
                else if(strcmp(name,"大") == 0)
                {
                        two.vote++;
                }
                else if(strcmp(name,"小") == 0)
                {
                        three.vote++;
                }
                else if(strcmp(name,"中") == 0)
                {
                        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();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

按照您的代码试了一遍,运行成功了,可是最后输出的结果票数都是零
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

"C:\Users\user\Desktop\捕获.PNG"
还是零呀......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我输出是正常的,看看你名字有没有输错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 11:44:27 | 显示全部楼层
1>------ 已启动全部重新生成: 项目: C, 配置: Debug Win32 ------
1>main.c
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.
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\stdio.h(1274): message :  参见“scanf”的声明
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.
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\conio.h(453): message :  参见“getch”的声明
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”
1>C.vcxproj -> C:\VisualStudioProjects\C\Debug\C.exe
1>已完成生成项目“C.vcxproj”的操作。
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========


看这个
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”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-9 11:48:10 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.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");






        name = malloc(1024);






        for(i = 0; i < 3; i++)
        {
                printf("\n请输入第%d次投票结果:\n", i);
                scanf("%s", name);
                if(strcmp(name, "小甲鱼") == 0)
                {
                        one.vote++;
                }
                else if(strcmp(name, "大") == 0)
                {
                        two.vote++;
                }
                else if(strcmp(name, "小") == 0)
                {
                        three.vote++;
                }
                else if(strcmp(name, "中") == 0)
                {
                        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();
}
1>------ 已启动全部重新生成: 项目: C, 配置: Debug Win32 ------
1>main.c
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.
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\stdio.h(1274): message :  参见“scanf”的声明
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.
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\conio.h(453): message :  参见“getch”的声明
1>C.vcxproj -> C:\VisualStudioProjects\C\Debug\C.exe
1>已完成生成项目“C.vcxproj”的操作。
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

这就是malloc的基本用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

还有为什么要引用<stdlib.h>呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

malloc函数在stdlib.h头文件中声明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦,那这条语句就是对name进行了初始化(分配了空间),是这样吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-4 03:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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