用cin怎样将数字从一组既含数字又含字符的输入中抽取出来

jigetage 2015-09-29 12:14:24
这个问题纠结好久了。
例如输入为:
1 2 34 55 2 ; 45 555 6 ; 23 ; 45 9 8,然后输入回车键,返回,此时所有数字被读取进迭代器中。
目的是将所有数字读取出来,跳过字符“;”,我采用的方法是
#include <iostream>
#include <vector>
int main()
{
int a;
vector<int> in;
while (true) {
cin>>a;
if (cin.fail()) {
cin.clear();
cin.ignore();
continue;
}
in.push_back(a);
}
return 0;
}
这时候,问题来了,所有数字全部读入进了vector中,这一要求完成了,但是,不能实现输入回车键,退出while循环的功能。
该如何修改才可以实现既跳过字符读入全部数字,又可以按回车键退出循环的功能呢?
谢谢!!!
...全文
294 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-09-29
  • 打赏
  • 举报
回复
乍看起来c++的cin、cout、ifstream、ofstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream! 使用scanf、printf、fscanf、fprintf、fread、fwrite。
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
lm_whales 2015-09-29
  • 打赏
  • 举报
回复
getline 函数
羽飞 2015-09-29
  • 打赏
  • 举报
回复
读取一行,然后对这一行数据做分析
赵4老师 2015-09-29
  • 打赏
  • 举报
回复
//输入 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111<Enter> //输出 //k,v,n=1,-954437177,79 //k,v,n=-1,-954437177,79 //End. //k,v,n=1,1729917383,29 //k,v,n=-1,1729917383,29 //End.
赵4老师 2015-09-29
  • 打赏
  • 举报
回复
#include <stdio.h>
char s[80];
char *p;
int v,n,k;
int main() {
    while (1) {
        fgets(s,80,stdin);
        if ('\n'==s[0]) break;
        p=s;
        while (1) {
            k=sscanf(p,"%d%n",&v,&n);
            printf("k,v,n=%d,%d,%d\n",k,v,n);
            if (1==k) {
                p+=n;
            } else if (0==k) {
                printf("skip char[%c]\n",p[0]);
                p++;
            } else {//EOF==k
                break;
            }
        }
        printf("End.\n");
    }
    return 0;
}
//输入
//1 2 34 55 2 ; 45 555 6 ; 23 ; 45 9 8<Enter>
//输出
//k,v,n=1,1,1
//k,v,n=1,2,2
//k,v,n=1,34,3
//k,v,n=1,55,3
//k,v,n=1,2,2
//k,v,n=0,2,2
//skip char[ ]
//k,v,n=0,2,2
//skip char[;]
//k,v,n=1,45,3
//k,v,n=1,555,4
//k,v,n=1,6,2
//k,v,n=0,6,2
//skip char[ ]
//k,v,n=0,6,2
//skip char[;]
//k,v,n=1,23,3
//k,v,n=0,23,3
//skip char[ ]
//k,v,n=0,23,3
//skip char[;]
//k,v,n=1,45,3
//k,v,n=1,9,2
//k,v,n=1,8,2
//k,v,n=-1,8,2
//End.
//输入
//100<Enter>
//输出
//k,v,n=1,100,3
//k,v,n=-1,100,3
//End.
//输入
//<Enter>
//
赵4老师 2015-09-29
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
    if (argc<2) {
        printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
        return 1;
    }
    f=fopen(argv[1],"r");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    z=0;
    b=0;
    n=0;
    L=0;
    while (1) {
        if (NULL==fgets(ln,MAXLEN,f)) break;
        L=strlen(ln);
        if ('\n'==ln[L-1]) {
            if (0==z) {
                for (i=0;i<L-1;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L-1) z=1;//当前行不是空行
            }
            if (0==z) b++; else n++;
            z=0;
        } else {
            if (0==z) {
                for (i=0;i<L;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L) z=1;//当前行不是空行
            }
        }
    }
    fclose(f);
    if (L>0 && '\n'!=ln[L-1]) {
        if (0==z) b++; else n++;//最后一行末尾无'\n'也计算
    }
    printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);
    return 0;
}
jigetage 2015-09-29
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
大神,我提问时候写的那个代码是可以完成数字和字符分类的,但是不能实现按下enter键退出while循环的功能,这个该怎么修改一下呢?谢谢。莫非要加signal吗?
jigetage 2015-09-29
  • 打赏
  • 举报
回复
引用 5 楼 y617754021 的回复:
楼上那都是 c语言 带的输入 输出方法 。。。用getline 方法 或者用get 都可以 实现你说的要求
cin.getline()只能实现将输入数据读入一个提前定义好的数组中,无法对输入数据进行操作的。
jigetage 2015-09-29
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
乍看起来c++的cin、cout、ifstream、ofstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream! 使用scanf、printf、fscanf、fprintf、fread、fwrite。
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
美中不足的是,需要提前定义一个数组来存储输入的数据。倘若不知道所输入数据大小,该怎么办呢?怎样做到一边输入一边存储呢?要采用迭代器吗?
赵4老师 2015-09-29
  • 打赏
  • 举报
回复
OnlyByOne 2015-09-29
  • 打赏
  • 举报
回复
楼上那都是 c语言 带的输入 输出方法 。。。用getline 方法 或者用get 都可以 实现你说的要求
jigetage 2015-09-29
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
乍看起来c++的cin、cout、ifstream、ofstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream! 使用scanf、printf、fscanf、fprintf、fread、fwrite。
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
大神!请受我膜拜一下!再膜拜一下!再膜拜一下! 一定要有三遍! sscanf()函数以前连听都没有听说,涨姿势了很多!

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧