c语言下简单通讯录的编写(新手,功能很单一,但简单)(附Python简单通讯录)

该文章用于记录我编程的过程,其中包含了很多改错的过程,有些猜想只能停留于小白瞎猜,所以请以批判的眼光审视该文章,欢迎指正~

目录

一、背景和Python代码

二、改错过程

1.Wrong 1&2

2.Wrong 3

3.Wrong 4

4.Wrong 5

感谢观看!!


一、背景和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;
}

感谢观看!!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬有雪的学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值