循环输入数字,以回车结束,C/C++

纯C版

我百度出来的答案(网址:(7条消息) 循环输入数字,以回车结束_清舞 点滴-CSDN博客_python输入回车结束循环https://blog.csdn.net/QW_sunny/article/details/80924279?utm_source=blogxgwz3)C语言版,是有BUG的,因此还是自己写了一遍。

本质思想还是队列,读取用户的输入,过滤非数字的字符,数字存到数组中,利用转换函数转换成长整形进行求和,可以解决用户“123 12 sss \n”这样的奇怪输入

IDE:DEV-C++ 5.11 

编译器:TDM-GCC 4.9.2 64-bit Release/Debug

/*
    循环输入数字,以回车结束 ;B站UP鱼C-小甲鱼《C++快速入门》P2课后题
*/ 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
	long int sum = 0;
	//int和long存储大小为4个字节(32bit)(double和long long是8字节),表示范围为 -2^31~2^31-1  最大为2,147,483,647,即占10位十进制位
	//所以申请20位字符存储用户输入的一次数字应该足够。 
	char input[20];
	int i;
	for(i=0; i<20; i++){
				input[i] = 0x00;
	}
	char c;
	char tempc[2];
	tempc[1] = 0x00;
	do{
		if( c >= '0' && c <= '9'){
			//C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
			tempc[0] = c;
			strcat(input,tempc);//如果直接strcat(input,&c)的话,假如 c='2',input的内容会被复制过一般,变为'22' 
		}else{
			//stdlib 标准库函数 long int atol(const char *str) 把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。
			sum += atol(input);
			for(i=0; i<20; i++){
				input[i] = 0x00;
			}
		}
	}while((c=getchar())!='\n'); 
	sum += atol(input);
	printf("输入数字的总和为:%ld",sum);
	return 0;
} 

C++ 版

找半天也没找到C++独有的特性来解决这个问题,最后还是用链队来解决吧。链队的规范代码参考严蔚敏的数据结构打的,目前使用下来没有什么BUG,有什么问题可以评论区交流。感觉用链队来解决还是有点小题大做了 QAQ

在写C++版代码的时候发现iostream库中的cin会跳过 空格 和 回车这俩输入,导致我还是用回了scanf,还得用stdio.h,只能说 C YYDS!!!

#include <iostream>
#include <stdlib.h>

using namespace std;

#define MAXQSIZE 100 	//队列可能达到的最大长度
#define QElemType char
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;

typedef struct QNode{
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;

//链队初始化 
Status InitQueue(LinkQueue &Q){
	Q.front = Q.rear = new QNode;	//生成新结点作为头结点,队头和队尾指针指向此结点 
	Q.front->next=NULL;				//头结点的指针域置空 
	return OK;
}

//链队入队(尾插法入链表)
Status EnQueue(LinkQueue &Q,QElemType e){
	//插入元素e为Q的新的队尾元素
	QNode *p;
	p = new QNode;		//为入队元素分配结点空间,用指针p指向 
	p->data=e;			//将新结点数据置为e 
	p->next=NULL;		//将新结点插入到队尾 
	Q.rear->next=p;		// 
	Q.rear=p;			//修改队尾指针 
	return OK; 
} 

//链队出队
Status DeQueue(LinkQueue &Q,QElemType &e){
	//删除Q的队头元素,用e返回其值
	QNode *p;
	if(Q.front==Q.rear){
		return ERROR;			//若队列空,则返回ERROR 
	} 
	p = Q.front->next;			//p指向队头元素 
	e = p->data;				//e保存队头元素的值 
	Q.front->next = p->next;	//修改头结点的指针域 
	if(Q.rear == p){	
		Q.rear=Q.front;			//最后一个元素被删,队尾指针指向头结点 
	}
	delete p;					//释放头元素的空间 
	return OK;
} 

//取链队的队头元素
QElemType GetHead(LinkQueue Q){
	//返回Q的队头元素,不修改队头指针
	if(Q.front!=Q.rear){
		return Q.front->next->data;
	} 
} 

int main(){
	LinkQueue Q;
	InitQueue(Q);
	char c;
	//cin会跳过回车符和空格,所以还得用scanf
	scanf("%c",&c);
	while(c != '\n'){
		EnQueue(Q,c);	//只要没有输入回车就不断让用户输入
		scanf("%c",&c); 
	} 
	QElemType e; 
	char number[20];		//申请20位字符存储用户输入的一次数字足够。
	int index = 0;	//e数组下标用于记录数字的长度 
	int i;
	long int sum = 0;
	while(DeQueue(Q,e)){
		if( e >= '0' && e <= '9'){
			number[index++] = e;
		}else{
			if(index > 0){
				sum += atol(number);
				for( i = 0; i < index; i++){
					number[i] = 0x00;	//赋值空值,作一次初始化,准备下次数字的读取 
				}
				index = 0;
			}
		}
	}
	if(index > 0){
		sum += atol(number);
		for( i = 0; i < index; i++){
			number[i] = 0x00;	//赋值空值,作一次初始化,准备下次数字的读取 
		}
		index = 0;
	}
	cout<<sum;
	return 0;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值