c语言上机小练(有点难)

1.题目

用指向数组的指针编程实现:输入一个字符串,内有数字和非数字符号,如:a123x456(此处一个空格)17960?302tab5876。将其中连续的数字作为一个十进制整数,依次存放到一个数组a中。例如:123放在a0中,456放在a1中,17960放在a2中,......并统计共有多少个整数,输出这些数。要求添加合适的注释。

要求:main函数存储字符串和提取得到的一组整型数,process函数负责完成提取字符串中的连续数字字符后转换为十进制整数并存入对应数组元素中,同时返回转换得到的整数个数,如果输入空串,process函数返回-1,如果非空串,但无连续数字字符,则返回0。main函数根据process返回值决定是否展示转换成功的一组数。合理设计process函数的接口参数。

2.分析

这道题真的是对我来说很难,是我第一次敲了两个小时的代码了,第一个小时是完成整数寻找的设计,第二个小时是对函数进行防御机制的设计,中间代码出错,一行一行调试了很久,发现调试太好用了,哭死。具体的写成注释了,不赘述。

复制代码
#include<stdio.h>
#define N 100  //确定字符串最大长度

//保护机制,函数防御
int process(char* a, int c)
{
	char* p = a;
	int x = 0;
	//先判定字符串是否存在有数字,有数字的话则把x赋值为1;
	for (p; (*p) != '\0'; p++)
	{
		if (((*p) >= '0') && ((*p) <= '9'))
		{
			x = 1;
			break;
		}
	}
	//根据数组名为首元素地址判定该字符串是否为空串
	if ((*a) == '\0')
		return -1;
   //值得运行的,即既有数字又非空串
	else if (x == 1)
	{
		return 1;
	}
	//单纯只有字母,不存在数字的
	else 
		return 0;
}

//求整数部分
func(char* a, int* b, int c)
{
char *p = a;
int i = 0;
int j = 0;
int x = 0;
for (p = a; (*p) != '\0'; p++)
//对该字符串整体循环一遍
	{
		if (((*p) >= '0') && ((*p) <= '9'))
		{
			if (x == 0) 
			{
				b[i] = (*p) - 48;
				//根据数字0的ASCII码值为48换算
				i++;
			}
			else
				b[i - 1] = b[i - 1] * 10 + (*p) - 48;
			    x = 1;
		}
		else
			x = 0;
	}

}

//求主函数
int main()
{
	char a[N];
	int b[N] = { 0 };
	int j = 0;
	int flat = 0;//flat的设立是防御机制
	printf("请输入一串字符\n");
	gets(a);
	flat = process(a, N);
	if (flat == 0)
	{
		printf("该字符串中不包含整数");
	}
	else if (flat == -1)
	{
		printf("该字符串为空串");
	}
	else if (flat == 1)
	{
		func(a, b, N);
		for (j = 0; b[j] != 0; j++)
		printf("%d ", b[j]);
		printf("\n");
		printf("共有%d个", j);
	}
	return 0;

}

3.总代码

复制代码
#include<stdio.h>
#define N 100  //确定字符串最大长度

//保护机制,函数防御
int process(char* a, int c)
{
	char* p = a;
	int x = 0;
	//先判定字符串是否存在有数字,有数字的话则把x赋值为1;
	for (p; (*p) != '\0'; p++)
	{
		if (((*p) >= '0') && ((*p) <= '9'))
		{
			x = 1;
			break;
		}
	}
	//根据数组名为首元素地址判定该字符串是否为空串
	if ((*a) == '\0')
		return -1;
   //值得运行的,即既有数字又非空串
	else if (x == 1)
	{
		return 1;
	}
	//单纯只有字母,不存在数字的
	else 
		return 0;
}


//求整数部分
func(char* a, int* b, int c)
{
char *p = a;
int i = 0;
int j = 0;
int x = 0;
for (p = a; (*p) != '\0'; p++)
//对该字符串整体循环一遍
	{
		if (((*p) >= '0') && ((*p) <= '9'))
		{
			if (x == 0) 
			{
				b[i] = (*p) - 48;
				//根据数字0的ASCII码值为48换算
				i++;
			}
			else
				b[i - 1] = b[i - 1] * 10 + (*p) - 48;
			    x = 1;
		}
		else
			x = 0;
	}

}


//求主函数
int main()
{
	char a[N];
	int b[N] = { 0 };
	int j = 0;
	int flat = 0;//flat的设立是防御机制
	printf("请输入一串字符\n");
	gets(a);
	flat = process(a, N);
	if (flat == 0)
	{
		printf("该字符串中不包含整数");
	}
	else if (flat == -1)
	{
		printf("该字符串为空串");
	}
	else if (flat == 1)
	{
		func(a, b, N);
		for (j = 0; b[j] != 0; j++)
		printf("%d ", b[j]);
		printf("\n");
		printf("共有%d个", j);
	}
	return 0;

}
相关推荐
小小帅呀3 分钟前
学习VLA第3天:训练一个最简单的神经网络
人工智能·神经网络·学习
m4Rk_31 分钟前
【论文阅读】Agent 记忆机制(50):PACE——按下一步预测价值动态分配历史记忆粒度
论文阅读·人工智能·学习·开源·github
电商API_180079052471 小时前
速卖通商品采集API技术文章
java·开发语言·c++·api·跨境电商·商品详情
zQ.ii1 小时前
WPF 触发器学习笔记
笔记·学习·wpf
汉克老师2 小时前
CSP-J 初赛(以满分为目标):第四课《看懂计算机到底在算什么!——C++变量、表达式和运算符 》
c++·小学生·学c++编程
边境悍匪2 小时前
蜗牛学苑 Java 智能体学习 Day28|JavaScript、CSS 布局思维导图复盘
学习
小小龙学IT2 小时前
zstd(Zstandard)开源压缩库实战指南:让数据又快又小
c++·开源
吃好睡好便好2 小时前
取整函数的使用
学习·matlab·生活·取整函数
那年窗外下的雪.2 小时前
STM32嵌入式学习 01:GPIO 输出与 LED 闪烁
stm32·单片机·学习
昌原的儿子LEO2 小时前
Linux进程知识点总结
linux·服务器·c语言·数据库