该文章用于记录我编程的过程,其中包含了很多改错的过程,有些猜想只能停留于小白瞎猜,所以请以批判的眼光审视该文章,欢迎指正~
目录
一、背景和Python代码
事情是这样的,有一天在我学习Python的字典的时候,讲师编写了一个网络热梗查询的代码,我一看,诶这不也能编写成一个超简单的通讯录么,所以我编写了以下代码:
#初始化字典
slang_test = {"小明": "13900000000", "小红": "15900000000"}
slang_test["李飞"] = "17800000000"#这里是我学习的时候试验添加元素写的
#输入联系人
flag = input("是否添加联系人?(是/否)>:")
if flag == "是":
number1 = int(input("请输入新添加联系人个数:"))
for i in range(0,number1):
name = input("请输入新添加联系人的名字:")
number=input("请输入该联系人电话号码:")
slang_test[name]=number
#查询
name_inquire = input("请输入您要查询的名字:")
if name_inquire in slang_test:
print(name_inquire + "的电话号码是" + slang_test[name_inquire])
else:
print("未查询到该联系人:<")
print("通讯录:"+str(slang_test))#遍历输出一下字典
正在苦逼学C语言的我看到Python如此简洁的代码留下了痛苦的眼泪😭
So,我在想能不能尝试用C语言编写一个simple的通讯录,然后...开始了痛苦之路
二、改错过程
1.Wrong 1&2
首先,来看看我第一步遇到的错误
#include<stdio.h>
//添加联系人
void contact_add(char address_book_name)//Wrong 2
{
}
int main()
{
char address_book_name[100][20];//Wrong 1
contact_add(address_book_name);
return 0;
}
Wrong 1:这个错误真的太蠢了,我把二维数组当成了字典在用,所以还是不推荐同时学习两种语言,血的教训
Wrong 2:这里我想了半天,最后还是不知道该如何传参,用我图示的方式在vs中会报错:
思考了很久无果后,我决定求助外援,老师给了我正确的传参方法,这里顺便将改正后的代码放出:
#include<stdio.h>
//添加联系人
void contact_add(char(*address_book_name)[20], char(*address_book_number)[15])
{
char flag;
int n = 1;
printf("是否添加联系人?(是/否):");
scanf("%c", &flag);
if (flag == '是')//Wrong 3
{
int n;
printf("请输入新添加联系人个数:");
scanf("%d", &n);
}
}
int main()
{
int n;
int flag = 1;
char address_book_name[100][20];//存储联系人名字
char address_book_number[100][15];//存储联系人号码
contact_add(address_book_name, address_book_number);
return 0;
}
我想应该是因为数组传回的是地址,所以要加*,然后二维数组要将列的大小也加上
改正了错误,我自信的添加了选择是否添加联系人的功能,运行后却直接跳过了,我们来看上述的Wrong 3:
2.Wrong 3
Wrong 3:我想是因为汉字的内存占用为2或3字节,所以用char类型不够,所以我果断放弃了中文,选用Y/N来选择是否
接着编程,结果遇到了一个令我很疑惑的错误:
3.Wrong 4
#include<stdio.h>
//添加联系人
void contact_add(char(*address_book_name)[20], char(*address_book_number)[15])
{
char flag;
int n = 1;
printf("是否添加联系人?(Y/N):");//选择是否添加联系人
scanf("%c", &flag);
if (flag == 'Y')
{
int n;
printf("请输入新添加联系人个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("请输入新添加联系人名称:");
gets(address_book_name[i]);//Wrong 4
printf("请输入新添加联系人号码:");
gets(address_book_number[i]);
}
}
}
int main()
{
int n;
int flag = 1;
char address_book_name[100][20];
char address_book_number[100][15];
contact_add(address_book_name, address_book_number);
return 0;
}
Wrong 4:错误提示为“未定义标识符"gets"”,我懵了,难道我安装的时候漏了一些函数???
就在我焦急万分之际,一篇cxdn文章给了我解答:https://blog.csdn.net/vivivivi1996/article/details/124100081
原来vs2015后就不支持gets了,变成了gets_s函数,但在我修改后调试的过程中仍遇到了一个问题:
又是直接跳过了两个gets_s函数(我为什么要说又\:滑稽)
于是我又在万能的csdn上找到了答案(在这里感谢两位大佬):
https://blog.csdn.net/weixin_44686373/article/details/104539631
在vs中一个源程序文件若前面有scanf(),那后面的gets_s()不起任何作用
而解决方法则是在scanf()与gets_s()中间加一个getchar()读取回车字符(源自评论区大佬)
4.Wrong 5
问题解决精神爽,下面代码敲敲敲:
#include<stdio.h>
//添加联系人
void contact_add(char(*address_book_name)[20], char(*address_book_number)[15])
{
char flag;
int n = 1;
printf("是否添加联系人?(Y/N):");
scanf("%c", &flag);
if (flag == 'Y')
{
int n;
printf("请输入新添加联系人个数:");
scanf("%d", &n);
getchar();
for (int i = 0; i < n; i++)
{
printf("请输入新添加联系人名称:");
gets_s(address_book_name[i]);
printf("请输入新添加联系人号码:");
gets_s(address_book_number[i]);
}
}
}
int main()
{
int n;
int flag = 1;
char target_name[20];//查询目标的名字
char address_book_name[100][20];
char address_book_number[100][15];
contact_add(address_book_name, address_book_number);
//查询联系人
printf("请输入要查询的联系人名称:");
gets_s(target_name);
for (int i = 0; i < 100; i++)//这里偷了个懒嘿嘿,直接n到100了,大家莫学我
{
if (address_book_name[i]==target_name)//Wrong 5
{
printf("%s的电话号码为:", address_book_name[i]);
puts(address_book_number[i]);
flag = 0;
break;
}
}
if (flag) printf("未查询到");
return 0;
}
Wrong 5:我真该死啊,老师刚讲的字符串的比较我傻不愣登s1==s2,应该用个strcmp()函数
最终,来看看完稿吧:
#include<stdio.h>
#include<string.h>
//添加联系人
void contact_add(char(*address_book_name)[20], char(*address_book_number)[15])
{
char flag;
int n = 1;
printf("是否添加联系人?(Y/N):");
scanf("%c", &flag);
if (flag == 'Y')
{
int n;
printf("请输入新添加联系人个数:");
scanf("%d", &n);
getchar();
for (int i = 0; i < n; i++)
{
printf("请输入新添加联系人名称:");
gets_s(address_book_name[i]);
printf("请输入新添加联系人号码:");
gets_s(address_book_number[i]);
}
}
}
int main()
{
int n;
int flag = 1;
char target_name[20];//查询目标的名字
char address_book_name[100][20];
char address_book_number[100][15];
contact_add(address_book_name, address_book_number);
//查询联系人
printf("请输入要查询的联系人名称:");
gets_s(target_name);
for (int i = 0; i < 100; i++)//这里偷了个懒嘿嘿,直接n到100了,大家莫学我
{
if (strcmp(address_book_name[i], target_name) == 0)
{
printf("%s的电话号码为:", address_book_name[i]);
puts(address_book_number[i]);
flag = 0;
break;
}
}
if (flag) printf("未查询到");
return 0;
}