C/C++中如何快速读取一个带空格的字符串。

一:C中(scanf读入一个带空格的字符串):
样例:

#include <stdio.h>
int main()
{
    char s[100];
    scanf( "%[^\n]", s );
    printf( "%s\n", s );
//  printf("%c\n", s[2] );
    return 0;
}

定制自己的扫描集 %[abc]、%[a-z]、%[^abc]、%[^a-z]。[]内是匹配的字符,^表示求反集。

二:C中(gets函数):
可以无限读取,以回车结束读取。
gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。gets()函数并不读取换行符’\n’,它会吧换行符替换成空字符’\0’,作为c语言字符串结束的标志。
gets()函数经常和puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志’\n’
但是不推荐使用因为gets(s),(s为一个字符串)。gets没有指明读取的最大字符数。这里就会出现一个潜在的问题:gets将不停的往s中储存内容,而不管是否存储的下!gets函数不会管s的可用空间有多少。如果输入的字符串过长,会导致缓冲区溢出(buffer overflow),即多余的字符超出了指定的目标空间。gets()函数就会访问未被分配的内存空间,如果这些内存未被使用,不会立即出现问题;如果这片空间已经存有数据,就会擦除掉程序中的其他数据,会导致程序中止。
(在C11标准里,gets函数已经被正式删除了。)

三:C中(fgets函数):
fgets与gets互为兄弟。
fgets(char buf, int bufsize, FILE stream ):。注意第二个参数bufsize,这个参数就限制了读取的字符的个数,这就可以解决gets()函数的缺陷。我们知道fgets() 函数主要用于读取文件,如果要读取键盘,则stream参数应该为stdin。需要注意的是,如果bufsize设置为n,那么fgets()函数最多读取n-1个字符,之所以用“最多”这个词是因为,如果在之前遇到了换行符”\n”,fgets函数也会返回,读取工作将会停止,而这个”\n”也会是buf字符串中最后一个有效字符(再往后就是字符串结束符”\0”了 ),只有在一种情况下,buf不会以”\n”结尾:读到文件结束符,并且文件的最后一个不是以”\n”结尾。还有就是,fgets()函数会读取换行符(这一点和gets函数不同),当读取结束后,fgets函数会为buf在末尾添加一个空字符作为字符串的结束。
当一个字符都没有读到时,fgets函数返回NULL。

四:C中(fgetc函数):
fgetc(fin),他会读取一个打开的文件fin,读取一个字符,然后返回一个int值。为什么返回的是int而不是char呢?因为如果文件结束,fgetc将返回一个特殊标记EOF,它并不是一个char。如果把fgetc(fin)的返回值强制转换为char,将无法把特殊值的EOF和普通字符区分开。如果要从标准输入读取一个字符,可以用getchar,它等价于fget(stdin)。
使用fgetc(fin)可以从打开的文件fin中读取一个字符。一般情况下应当再检查它不是EOF后再将其转化成char值,从标准输入读取一个字符可以用getchar,他等价于fgetc(stdin)。
fgetc和getchar将读取“下一个字符”,因此需要知道在各种情况下,“下一个字符”是哪个。如果用“scanf()”读取整数,则要是再输入后多加了一个空格,用getchar读取到的将是这个空格;如果在输入之后紧跟着换行,则读取到的是回车符“\n”。

五:C++中(getline函数):
string类中的getline函数简单基本用法。

#include <iostream>
#include <string>
using namespace std;
int main()
{
     string a;
     getline(cin,a);
     cout<<a<<endl;
     return 0;
}

string类中的getline函数高级用法。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string a;
    char s='0';
    getline(cin,a,s);
    cout<<a<<endl;
    return 0;
}

此时,getline函数只会读取自己定义的字符s之前的字符,读取到s就停止读取了。

在char数组下也可以使用getline()函数简单用。

#include <iostream>
#include <string>
using namespace std;
int main()
{
     char a[100];
     cin.getline(a,sizeof(a));
     cout<<a<<endl;
     return 0;
}

(cin.get()的用法同上。)

istream类中的getline函数,由于鄙人学识尚浅,仅仅string类的够用,对于istream和string的区分不够清楚,暂不总结,仅仅知道不同就行。

猜你喜欢

转载自blog.csdn.net/henu1710252658/article/details/80173846