通常情况下没啥用,因为……

用cin过不了的,用scanf可能过;
用scanf过不了的,用getchar基本也不过……

不过有时候还是挺好用的。常用的一般有int 和 string 两种,至于是用引用还是返回值,这个……随便吧。


以下代码所依赖的头文件:

#include <cstdio>
#include <cctype>

#include <iostream>

//可能需要
#include <cstring>
#include <string>

string:

void gs(string &s){
	char t; s = "";
	for(t=getchar(); !isprint(t);t=getchar());
	for(; isprint(t); s+=t, t=getchar());
}

int:

int g() {
	char t = getchar();
	int a = 0;
	for(; !isdigit(t); t=getchar());
	for(; isdigit(t); a*=10,a+=t-48,t=getchar());
	return a;
}

如果想要判断是否输入结束的话,可以用这个:

int r() {
	char t = getchar();
	int a = 0;
	for(; !isdigit(t) && (~t); t=getchar());
	for(; isdigit(t); a*=10,a+=t-48,t=getchar());
	return a;
}
int gs(string &s){
	char t; s = "";
	for(t=getchar(); !isprint(t)&&(~t);t=getchar());
	for(; isprint(t); s+=t, t=getchar());
	return t;
}

C-style string:

/**
 * 倪文卿 of ThinkSpirit @ 2017 all rights reserved
 */

#include <stdio.h>
#include <cctype>


int gs(char *s)
{
	int c;
	do {
		c=getchar();
		if(c==-1 || c==26) {
			*s=0;
			return EOF;
		}
	} while(c<=32);

	do {
		*s++=c;
		c=getchar();
	} while(c>32);

	return *s=0;
}

int main()
{
	char s[100]= {'a','a','a'};
	while(gs(s)!=EOF) {
		printf("%s\n",s);
	}

	return 0;
}

多个C-style string:

下面的 ngs 和 nps 函数只要会用就行了,具体实现原理不必看懂。要是能看的懂的话,你就明白为什么 scanf 和 printf 能传多个参数了

/**
 * 倪文卿 of ThinkSpirit @ 2017 all rights reserved
 */

#include <stdio.h>
#include <cstdarg> // C 语言中支持可变参数列表的头文件

int gs(char *s)
{
	int c;
	do {
		c=getchar();
		if(c==-1 || c==26) {
			*s=0;
			return EOF;
		}
	} while(c<=32);

	do {
		*s++=c;
		c=getchar();
	} while(c>32);

	return *s=0;
}

int ngs(char *s,...)
{
	if(gs(s)==EOF) {
		return EOF;
	}

	va_list arg_ptr; //指向参数的指针
	va_start(arg_ptr, s);

	while(*(char**)arg_ptr!=NULL) {
		if(gs(*(char**)arg_ptr)==EOF) {
			va_end(arg_ptr);
			return EOF;
		}
		va_arg(arg_ptr, char*);
	}
	va_end(arg_ptr);
	return 0;
}

void nps(const char *s,...)
{
	va_list arg_ptr; //指向参数的指针
	puts(s);
	va_start(arg_ptr, s);

	while(*(const char**)arg_ptr!=NULL) {
		puts(*(const char**)arg_ptr);
		va_arg(arg_ptr, const char*);
	}
	va_end(arg_ptr);
}

int main()
{
	char s[100]="abcdefg";
	char s2[100]="cdefg";
	char s3[100]="00101";

	nps(s,s2,s3,NULL);

	while(ngs(s,s2,s3,NULL)!=EOF) {
		puts(s);
		puts(s2);
		puts(s3);
	}

	puts(s);
	puts(s2);
	puts(s3);


	return 0;
}

 

CC BY-NC-SA 4.0 奇技淫巧#2 getchar读入优化 by J. Chen is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.