精华内容
下载资源
问答
  • 可以使用C语言中scanf、gets、fgets,C++中cin、getline函数读取字符串,当字符串字符数量非常大时,这些函数的效率究竟是如何的呢?本博客主要解决这一问题。 准备测试数据 我们先在桌面新建一个名为test的文件夹,...

    转自:https://blog.csdn.net/richenyunqi/article/details/89203826
    可以使用C语言中scanf、gets、fgets,C++中cin、getline函数读取字符串,当字符串字符数量非常大时,这些函数的效率究竟是如何的呢?本博客主要解决这一问题。
    准备测试数据
    我们先在桌面新建一个名为test的文件夹,作为本次实验的文件夹。我们希望向该文件夹下的input.txt文件(这个文件程序会自动生成)中写入5000个字符串,每个字符串为10000个0字符,字符串间用换行符分隔开,共计5000万个字符,以此作为输入数据, 程序如下:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        ofstream out("C:/Users/Administrator/Desktop/test/input.txt");//文件路径可按你自己的想法替换
        for(int i=0;i<5000;++i){
            for(int j=0;j<10000;++j){
                out<<"0";
            }
            out<<endl;
        }
        out.close();
        puts("successful");//控制台输出successful时,表示文件数据写入完毕
        return 0;
    }
    

    读取数据
    共对C语言中scanf、gets、fgets,C++中cin、getline这5个函数进行比较,我们可以让这5个函数分别读取1000万个0字符。程序如下:
    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    char input[100005];
    string str;

    clock_t s= clock();//读取开始时间
    for(int i=0;i<1000;++i)
        scanf("%s",input);
    clock_t e= clock();//读取完毕时间
    printf("scanf:%.0fms\n",(double)(e-s)/CLOCKS_PER_SEC*1000);//输出整个读取过程花费时间,单位:毫秒
    
    s= clock();//读取开始时间
    for(int i=0;i<1000;++i)
        gets(input);
    

    e= clock();//读取完毕时间
    printf(“gets:%.0fms\n”,(double)(e-s)/CLOCKS_PER_SEC*1000);//输出整个读取过程花费时间,单位:毫秒

    s= clock();//读取开始时间
    for(int i=0;i<1000;++i)
        fgets(input,10005,stdin);
    e= clock();//读取完毕时间
    printf("fgets:%.0fms\n",(double)(e-s)/CLOCKS_PER_SEC*1000);//输出整个读取过程花费时间
    ,单位:毫秒*/
    
    s= clock();//读取开始时间
    for(int i=0;i<1000;++i)
        cin>>str;
    e= clock();//读取完毕时间
    printf("cin:%.0fms\n",(double)(e-s)/CLOCKS_PER_SEC*1000);/*输出整个读取过程花费时间
    ,单位:毫秒*/
    
    s= clock();//读取开始时间
    for(int i=0;i<1000;++i)
        getline(cin,str);
    e= clock();//读取完毕时间
    printf("getline:%.0fms\n",(double)(e-s)/CLOCKS_PER_SEC*1000);/*输出整个读取过程花费时间
    ,单位:毫秒*/
    return 0;
    }
    

    编译运行后会生成一个exe可执行文件,找到这个exe文件并复制粘贴到test文件夹下。并重命名为test.exe
    进行比较
    在test文件夹下新建一个compare.txt文件,并向其中写入以下程序:

    test < input.txt > output.txt
    pause
    

    保存并关闭文件后,将compare.txt的后缀名txt更改为bat。
    经过以上操作后,test文件夹下应该有3个文件:

    input.txt:测试数据
    test.exe:测试程序
    compare.bat:执行脚本
    此时双击compare.bat脚本,会跳出一个dos窗口,等待一段时间,当dos窗口输出请按任意键继续. . .的字样时,关闭dos窗口,会发现test文件夹下新生成了一个output.txt文件,打开该文件,就可以看到各个函数读取数据所用时间。
    我执行时output.txt文件内容如下:

    scanf:960ms
    gets:72ms
    fgets:76ms
    cin:2275ms
    getline:2189ms
    

    结论
    按照所用时间从小到大进行排序,得到的结果如下:
    在这里插入图片描述
    我们可以发现gets和fgets函数读取字符串的速度是最快的,读取时间约为scanf函数的1/13,约为getline和cin的1/30,由于gets函数由于不安全已被c11标准废弃,在以后读取字符串时,如果字符串很长,应尽可能使用fgets函数。
    另外,scanf函数的读取效率约为getline和cin的1/2,getline比cin稍快。

    那么为什么会出现这样的情况呢?
    以fgets函数和scanf函数为例,由于fgets只负责读取字符串,而scanf函数还可以读取其他如int、double类型的数据,所以scanf函数就多了确定读取的数据是何种类型的步骤,因而花费了更多的时间。
    而getline和cin函数只能向string类型中读入数据,由于string类型是在堆上分配的,在读取数据的时候需要不断从堆上申请动态分配内存,不如char数组直接提前分配好了所有内存来得更为简便。此外在向string类型读入数据的时候,还需要调用string类型的构造函数,初始化包括begin()、end()、size()等类内数据成员和成员函数,这也花费了很多时间。所以string类型比char数组提供了许多使用更为简便的函数和成员,但也要为此承担时间上的代价。

    展开全文
  • C++ 使用getline读取一行字符串

    万次阅读 多人点赞 2015-10-03 19:50:58
    这里介绍c++里面常用读取一行字符串的用法 getline()函数 getline(istream &in, string &s) 从输入流读入一行到string s •功能: –从输入流中读入字符,存到string变量 –直到出现以下情况为止:...

    刷一道水题的时候,看到了这个用法,因为喜欢C++风格,就没有用gets或者fgets来读取一行字符串。

    这里介绍c++里面常用读取一行字符串的用法 getline()函数

    getline(istream &in, string &s)

    从输入流读入一行到string s

    功能
    –从输入流中读入字符,存到string变量
    –直到出现以下情况为止:
    •读入了文件结束标志
    •读到一个新行
    •达到字符串的最大长度
    –如果getline没有读入字符,将返回false,可用于判断文件是否结束
    下面以OJ上一道水题为例

    Description

    输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

    Input

    一行字符

    Output

    统计值

    Sample Input 

    aklsjflj123 sadf918u324 asdf91u32oasdf/.';123
    

    Sample Output

    23 16 2 4

    我们看到,如果这题用cin的话,显然是读到空字符,如空格符,换行符,制表符的时候,就算读入了一个字符串了。这样达不到题目的要求,我们这就要用到C++里面的getline()函数,来读取一行字符串。

    下面贴一下代码

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    
    using namespace std;
    
    int main ()
    {
        string c;
        int a=0,b=0,d=0,e=0;
    
    
        while (getline(cin,c))
        {
    
               for(int i=0;i<c.size();i++)
               {
                    if((c[i]>='a'&&c[i]<='z')||(c[i]>='A'&&c[i]<='Z'))
                     a++;
                    else if(c[i]>='0'&&c[i]<='9')
                    b++;
                    else if(c[i]==' ')
                    d++;
                    else
                    e++;
               }
                    cout<<a<<" "<<b<<" "<<d<<" "<<e<<endl;
    
        }
        return 0;
    }
    
    这里就很容易达到题目要求了。

    反正就是要注意cin的用法,读取空字符的时候会跳过。

    展开全文
  • getline字符串读入

    2019-09-25 04:56:45
    也许是最近模拟题打多了的缘故,我发现自己渐渐变得比较毒瘤起来,当然这也是有一定的好处的,因为从中我也学到了一些处理字符串的正确姿势,今天我们就来讲一 讲如何用函数getline来读入一整行字符串进行处理。...

    也许是最近模拟题打多了的缘故,我发现自己渐渐变得比较毒瘤起来,当然这也是有一定的好处的,因为从中我也学到了一些处理字符串的正确姿势,今天我们就来讲一 讲如何用函数getline来读入一整行字符串进行处理。或者他的一些变体。

    首先我们先需要知道为什么我们要学习这个函数,是这样的,相信大家都应该知道以前有一个函数叫做gets,这个函数非常的好用,你可以非常快捷的使用他来进行一整行字符串的输入,但是这个函数不知道为什么在正式的比赛中,很容易使用它而导致挂掉,而又因为最基本的读入getchar本人在写的时候,也经常会出现一些意想不到的错误,所以我们急需一个可以既安全的能够读入字符串的函数,又并不是非常的难书写,这里就要引入getline了。

     

    因为string类型非常的慢,所以考试的时候我们基本上不用,这个类型,所以说我们只需要掌握一下,getline关于字符串(char)类型的输入就可以了。然后这个其实也还是非常的简单的。

    getline这个函数是属于iostream库的,然后我们只需要在代码中写这一句话即可

    cin.getline(字符串名,字符串大小,*条件

    然后这个关于条件这个东西,一般不填,如果不填,默认读到回车时结束,如果填了,那么 就会读到你想要指定的那个字符前停止读入。

     

    标准代码如下:

     

    #include<iostream>
    using namespace std;
    char ch[1024];
    int main()
    {
        cin.getline(ch,1024,'E');
            cout<<ch;
        cout<<"A";
    }

    运行结果:

     

    相信大家应该都会使用getline了。

    谢谢采纳!

    转载于:https://www.cnblogs.com/mudrobot/p/9142431.html

    展开全文
  • int getline(char s[], int maxlen) { //maxlen为最大长度限制,若题目要求没有最大限度,则直接写成int getline(char s[]) int c, i, len; //注意c要声明为int型来接收读入的字符,用char型在某些情况下会出错 i =...
    int getline(char s[], int maxlen) {                    //maxlen为最大长度限制,若题目要求没有最大限度,则直接写成int getline(char s[])
        int c, i, len;                          //注意c要声明为int型来接收读入的字符,用char型在某些情况下会出错
        i = len = 0;
        while (--maxlen && (c = getchar()) != EOF && c != '\n') {    //--maxlen而不是maxlen--是因为要留一个位置给'\0',要少读一个
            s[i++] = c;
            len++;
        }
        if (c == '\n')                           //如果是以回车结束,先把回车读进来,再把回车换成'\0'(和gets的原理相同)
            s[i] = '\n';
    
        s[i] = '\0';                                 //在最后加一个'\0'以结束字符串
        return len;
    }

     

    展开全文
  • 如何使用getline读入字符串(char)

    千次阅读 2018-06-05 22:43:52
    也许是最近模拟题打多了的缘故,我发现自己渐渐变得比较毒瘤起来,当然这也是有一定的好处的,因为从中我也学到了一些处理字符串的正确姿势,今天我们就来讲一 讲如何用函数getline来读入一整行字符串进行处理。...
  • C++ getLine()函数读取字符串时,总是先读取一个回车符,怎么解决 C++ getLine()函数读取字符串时,总是先读取一个回车符,怎么解决
  • 使用getline需要引入头文件string #include<string> string ss; getline(cin, ss); 这样,getline遇到回车或者EOF才结束操作。 需要注意的是,如果getline用在cin后面,比如: string ss; int T; cin ...
  • Cpp中使用getline读取一整行字符串

    千次阅读 2016-11-19 19:43:09
    getline是在string头文件中定义的一个函数,以一个istream对象和一个string对象作为输入参数。该函数首先读取输入流的内容直到遇到换行符停止,然后将读入的数据存入string对象,最后返回istream对象。其中换行符...
  • C++ 用getline输入字符串

    千次阅读 2019-02-11 23:04:54
    #include "stdafx.h" #include &lt;string&gt; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string country,city;... getline(cin,country,','); getlin...
  • 使用cin对象对C风格字符串执行输入操作时存在一个缺陷,如下: #include <iostream> using namespace std; int main() { const int stringSize = 64; char string1[stringSize]; char string2...
  • c++存储字符串的方法0、 读取字符串1、char 数组2、string 类型 0、 读取字符串 c++ 读取字符串的方式有很多,除了常用的scanf()、cin>>,还有其他函数,参见:C++基础:各种输入方法总结,cin、cin.get()、...
  • 人老了,记性不好了,看一篇忘一遍,还是梳理下吧!这里所谓的字符串为C-风格字符串,即含有空字符结束符的字符数组;
  • 字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。 输出格式: 每个测试用例的输出占一行,输出倒序后的句子。 ...
  • *文件名称:main.cpp  *作 者:杨栋 *版 本 号:v1.0  时间:4月21日 ... getline(cin,city,',');  getline(cin,state);  cout State:";  }  return 0; }
  • 要知道,scanf函数虽然可以读取字符串,但是scanf函数是以空格为结束的,也就是说scanf只能读取没有空格的一行字符串,"HelloWorld"可以被读取,但"Hello World"就不行,输出结果你会发现就只有Hel...
  • C++ primer plus 第5章课后习题第7题,在使用cin读取键盘输入的数字后,又使用getline(cin,str)函数读取新的字符串,在读取num1之后直接跳过了getline函数,开始读取num2。原因是第一次使用cin后,换行符留在了输入...
  • C++读取字符串

    2019-04-11 22:00:34
    : cin 在读取字符串时使用空白(空格、制表符和换行符)来确定字符串的结束位置,这说明cin在获取字符数组输入时只能读取一个单词。而读取该单词后,cin将该字符串放到数组中,并在结果自动添加空字符。 So,在某些...
  • C++里cin.getline()如果超过限定输入字符串,即使clear了之后还是会被下一个getline读取,如何解决?
  • 这里写自定义目录标题]C++读取字符串的两种方式1. getline(): 读取行的输入2. get(): 读取行的输入 C++读取字符串的两种方式 1. getline(): 读取行的输入 getline函数读取整行, 它使用通过回车键输入的换行符来确定...
  • string str; getline(cin,str); 用于读取一整行字符串,注意传入值必须是string类型!
  • 这就意味着cin在获取字符数组输入时,只读取一个单词,将该字符串放入数组中,并自动在末尾添加空字符。 如 : cout&lt;&lt;"Enter your name:\n"; cin&gt;&gt;name; cout&lt;&...
  • C++ 读取字符串

    2020-03-09 12:08:08
    在C++中可以通过cin来读取一个字符串,但是每次读取一个单词并不是最好的选择,例如,假设程序要求读入的城市名,用户输入New York,希望程序读入的是完成的城市名,而不单单是一个单词。C++提供了一次额面向行的类...
  • C++从标准输入输出读取字符串

    千次阅读 2019-09-13 14:22:36
    C++从标准输入输出读取字符串1、getline()方法在C++中本质上有两种getline函数:第一种:在头文件<istream>中,是iostream类的成员函数。第二种:在头文件<string>中,是普通函数。第一种在<istream&...
  • 读取字符串长度

    2021-01-27 17:31:12
    c++关于读取一个字符串长度(包括空格回车) 自用 方法1 #include <iostream> #include <cstring> using namespace std; int main() { string a; getline (cin,a); cout <<a.size()<<...
  • 读取一行字符(字符串间有空格,不能直接cin >> string) 使用 getline(cin, str) 其中,str为std::string类型,可包含空格 例题 密码翻译 密码翻译-牛客网题目网址 题目描述 在情报传递过程中,为了防止情报...
  • 如题,近来在刷字符串相关机试题时,因为要从键盘读入字符串进行判断,故采用cin.getline()函数来获取键盘写入的字符串,多次循环输入判断。 若开始输入字符串之前要输入一个数据代表输入多少组字符串。则在cin....
  • istream&getline(istream&is,string&str,char delim); istream&getline(istream && is,string&str,char delim); (2) istream&getline(istream&is,string&str); istream&getl...
  • 【C++】以逗号为分隔符读取字符串

    千次阅读 2020-08-01 21:33:41
    C++,以逗号为分隔符读取字符串,使用 sstream 中的 stringstream 从字符串中按逗号分隔读取各个子串。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,567
精华内容 7,826
关键字:

getline读取字符串