字符串输入的2种常用方法详解

  • 一.scanf函数
    • 1.扫描集
    • 2.逆向使用扫描集
  • 二.gets函数

一.scanf函数

int main(){char arr[50] = { 0 };scanf("%s", arr);printf("%s", arr);return 0;}

这种方法可以输入字符串,但是只能输入一个词,遇到空格就结束了。,空格之后的字符,会留在缓冲区,等待下次读入。

如果我们要使用scanf函数来输入的话,有没有办法呢?
答案:有的。

1.扫描集

除了转换修饰符 s 以外,也可以使用“扫描集”(scanset)修饰符来读取字符串它由方括号所包含的一串无序字符组成([scanset])。scanf()函数接着读取所有字符,然后将它们存储为一个字符串(带有字符串终止符),直到遇到不匹配扫描集中任一字符时才停止。

int main(){char arr[50] = { 0 };scanf("%[123456789]", arr);printf("%s", arr);return 0;}

此时我们会发现一个问题,就是扫描集只能识别扫描集里面的字符。
不过没关系,我们只需要改动一点点就行,这样不行的话,我们就反着来。

2.逆向使用扫描集

逆向使用转换扫描集(也就是说,除扫描集中的字符外,其他都符合),做法是在扫描集的左括号后面加上一个插入号(^)。

int main(){char arr[50] = { 0 };// \n是按下回车后输入的,[^\n] 的意思是 除了\n之外的字符scanf("%[^\n]", arr); //字符串末尾有\0printf("%s", arr);return 0;}

使用scanf时,最后的\n(按下回车时输入的)会遗留在缓冲区中,如果使用scanf,则需要使用gerchar()将缓冲区的Enter吃掉

二.gets函数

char arr[50] = { 0 };gets(arr);//末尾有\0puts(arr);


使用 gets() 时,系统会将最后“敲”(Enter)的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符

总结:
1 .我个人认为使用gets()函数比较方便,同时缓冲区中还不会遗留数据。
2.如果要使用scanf()函数,那么使用逆行扫描集会好很多,同时也需要注意缓冲区中的\n