fgets的原型是char* fgets(char* s, int n, FILE* fp);
參數數量比較多,有3個。而fgets相比於gets有一個顯著的差異就是fgets會將行末的換行符算到讀入的字符串裏面。因此相同且正常(輸入無錯誤,緩衝區夠大)的狀況下,fgets讀入的字符串會比gets在末尾'\0'前面多一個換行符;行長度超出緩衝區大小時只讀入前 n-1 個字符。所以,gets(s);至關於html
fgets(s, sizeof(s), stdin);
if(s[strlen(s) - 1] == '\n') s[strlen(s) - 1] = '\0'; // 去掉換行符數組
其實,末尾這個換行符是另有妙用的。this
#include <stdio.h> #include<string.h> int main() { int a,b=0,c=0; char line[100],newline[100]; char temp; scanf("%d%c",&a,&temp); while(a--) { fgets(line,sizeof(line), stdin);//if scanf("%s",line); then whitespace can not inputed. //printf("%d\n",strlen(line)); memset(newline,'\0',sizeof(newline));//temporary newline int i,j; i=0;j=0; int isMoreSpace=0; for(;i<strlen(line);i++) { if(line[i]==' ') isMoreSpace++; else { if(isMoreSpace>0) { newline[j++]=' '; } newline[j++]=line[i]; isMoreSpace=0; } } printf("%s\n",newline); } return 0; } /*input 3 hello kugou ni hao a ni ni ni ni */
設置兩個變量,分別記錄當前輸入的字符和上一次輸入的字符,「上一個字符」初始化爲EOF。若是當前輸入字符爲空,上一個輸入字符也爲空,則忽略當前輸入的字符。spa
#include <stdio.h> /* http://www.cnblogs.com/wuzhenbo/archive/2012/12/02/2798029.html 當前輸入字符能夠分爲兩種狀況: 一、當前輸入字符不爲空,則直接輸出這個字符便可; 二、當前輸入字符爲空,這種狀況又能夠分爲兩種狀況: ①、上一個輸入字符也爲空,則忽略這次輸入的空格便可; ②、上一個輸入字符不爲空,則直接輸出這個字符便可。 基本思想是: 設置兩個變量,分別記錄當前輸入的字符和上一次輸入的字符,「上一個字符」初始化爲EOF。 若是當前輸入字符爲空,上一個輸入字符也爲空,則忽略當前輸入的字符。 */ int main() { int c, pc; /* c = character, pr = previous character */ /* set pc to a value that wouldn't match any character, in case this program is over modified to get rid of multiples of other characters */ pc = EOF; int a; char tmp; scanf("%d%c",&a,&tmp); while ((a>0)&&(c = getchar()) != EOF) { if (c == ' ') if (pc != c) /* or if (pc != ' ') */ putchar(c); /* We haven't met 'else' yet, so we have to be a little clumey */ if (c != ' ') { if(c=='\n') a--; putchar(c); } pc = c; } return 0; } /*input 3 hello kugou ni hao a ni ni ni ni */