纯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;
}