【转】
1.最简单的是将一个字符串分为一个一个字符输入
char s[100];
int i=0;
while(scanf("%c",&s[i]),s[i]!='\n')i++;
s[i]='\0'; //遇到换行停止输入,并且将换行替换为\0
printf("%s\n",s);
但是如果在这段程序前还有其他类型的输入,则需要把回车吃掉,即加一条scanf(“%*c”),或者使用 getchar(),因为scanf不会将\n或者空格符赋值给字符串,但会赋值给字符输入”%c”.
如:
int x;
scanf("%d",&x);
printf("%d\n",x);
scanf("%*c"); //用来吃掉输入x时的分隔符号,可以是\n,或者空格之类的;
while(scanf("%c",&s[i]),s[i]!='\n')i++;
s[i]='\0';
printf("%s\n",s);
ps:
getch()是从键盘接收
getchar()是从缓冲区读取,也都可以实现这个类似功能。
关于键盘上的回车键,可能大家都知道,按下回车键,在Window下产生两个字符,是\r\n(回车+换行),程序输入文本时遇到”\r\n”转换为\n,输出是将\n转为\r\n(二进制方式下不存在这种方式),这是Window系统的特立独行吧。这与mac和Unix都不相同,不详细说了。
2.char *gets( char *buffer )
比较简单,gets读取一行,遇到\n结束,它会把\n一并读取,并将\n替换为\0。(\n不会留在缓冲区)
char s[100];
gets(s);
如果输入abc def回车,则s中的值为abc def\0
关于程序前面的输入遗留的分隔符和第一种方法一样;
3.fgets(char * s,int size,FILE * stream)
和gets差不多,fgets会读取行尾的\n,然后再添加\0,(\n不会留在缓冲区)
char s[100];
fgets(s,40,stdin);
如果输入abc def回车,则s中的值为abc def\n\0
4.scanf(“%[^\n]”,s)
使用scanf正则表达式,直到遇到\n停止输入,\n不会进入s,会留在缓冲区,需要吃掉,可以scanf(“%[^\n]%*c”,s)或者getchar()吃掉,这里\n可以换成其他字符。
当然用c++的话有getline,get等
cin.getline会将缓冲区的\n抛弃,cin.get不会(结束符会留在缓冲区)。
其实那都是在默认结束符号为\n时,当结束符设置为’a’,则抛弃a,如果a之后的字符仍在缓冲区中。
总结:输入放入缓冲区,函数再从缓冲区读取,每个函数都有不同的处理方式,于是乎就让人纠结起来,我也没讲全,但针对空格是基本够用了。