user-0 提问: C语言输入几行字符然后统计

回复:
user: user-1
content: 引用 4 楼 寻开心 的回复:char *p = fgets(buf, sizeof(buf), stdin); //从标准输入读入行 if (p == NULL || buf[0] == '\n') break; //如果EOF或者没有输入数据则结束循环（如果是Ctrl+z则判断p==NULL就可以了） lines++; 这样不行的。  buf开的再大，理论上输入的内容都可能比它还大 这样直接的line ++ 是不对的 fgets可以把回车符读入进来， 要根据这个判断line++ 然后要特别注意最后一行，有可能直接遇到feof而没有遇到回车，那就还需要加上遗爱湖特殊处理最后一行 确实，要考虑输入大于buf长度的情况。 int main(int argc, const char * argv[]) {     int chars=0, words=0, lines=0, whitespaces=0, uppercase=0, lowercase=0, digits=0, flag=0, len=0;     char buf[256];     while (1)     {         char *p = fgets(buf, sizeof(buf), stdin); //从标准输入读入行         if (p == NULL || buf[0] == '\n') break; //如果EOF或者没有输入数据则结束循环（如果是Ctrl+z则判断p==NULL就可以了）         len = (int)strlen(buf);         for (int i=0; i<len; i++)         {             if (buf[i]>='0' && buf[i]<='9')             {                 digits++;             }             else if (buf[i]>='A' && buf[i]<='Z')             {                 uppercase++;                 flag++;             }             else if (buf[i]>='a' && buf[i]<='z')             {                 lowercase++;                 flag++;             }             else if (isspace(buf[i])) {                 whitespaces++;                 if (flag>0)                 {                     words++;                     flag = 0;                 }                 if (buf[i]=='\n') {                     lines++;                     len = 0;                 }             }             chars++;         }     }     if (flag>0) words++;     if (len>0) lines++;     printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n", chars, words, lines, whitespaces, uppercase, lowercase, digits);     return 0; }

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<string.h>   typedef struct Stat {     int nChars;     int nWords;     int nLines;     int nWhitespaces;     int nUppercase;     int nLowercase;     int nDigits; } Stat;  // 统计每行的内容，如果最后一个字符不是回车'\n'返回1，否则返回0 int statistics (const char * str, Stat * pStat) {     int len = (int) strlen(str);     int bNewWord = 0; // 标记是否是一个新的单词的开始     for ( int i=0; i<len; i++) {         char ch = str[i];         pStat->nChars ++;         if ( ch == '\n')             pStat->nLines ++;         else if (ch == ' ' || ch == '\t') { //空格和tab             pStat->nWhitespaces ++;             bNewWord = 0;         } else if ( '0' <= ch && ch<='9' ) {             pStat->nDigits++;             if ( bNewWord == 0 ) {bNewWord=1; pStat->nWords++;}         } else if ( 'a'<=ch && ch<='z'){             pStat->nLowercase ++;             if ( bNewWord == 0 ) {bNewWord=1; pStat->nWords++;}         } else if ( 'A' <=ch && ch<='Z') {             pStat->nUppercase++;             if ( bNewWord == 0 ) {bNewWord=1; pStat->nWords++;}         } else {             // 标点符号等其他情况，非空白，非数字，非大小写字母的情况             // ! 也作为独立的单词参与统计的话，下面这行就打开，否则注释掉             if ( bNewWord == 0 ) {bNewWord=1; pStat->nWords++;}         }     }     if ( str[len-1] != '\n')         return 1;  // buffer读满了，还没有结束一行的情况；或者eof到了但是没有回车     else         return 0; };  int main() {     Stat st = {0};     FILE * fp = stdin; // 如果是是文件，就fp=fopen什么的自己处理吧     // 可以通过减少BUFERSIZE的大小来测试，一行长度超过buffer的例子 #define BUFFERSIZE 256     char buffer[BUFFERSIZE];     char *p=NULL;     int  value = 0;     // fgets只有在遇到错误或者到达feof的时候返回null     while ( (p = fgets(buffer, BUFFERSIZE, fp)) != NULL ) {         value = statistics(buffer, &st);     };     if (feof(fp)) st.nLines += value;     fclose(fp);     printf("Chars:%d Lines:%d Words:%d Digit:%d Uppercase:%d Lowcase%d\n",\            st.nChars, st.nLines, st.nWords, st.nDigits, \            st.nUppercase, st.nLowercase);     return 0; }

user: user-2
content: char *p = fgets(buf, sizeof(buf), stdin); //从标准输入读入行 if (p == NULL || buf[0] == '\n') break; //如果EOF或者没有输入数据则结束循环（如果是Ctrl+z则判断p==NULL就可以了） lines++; 这样不行的。  buf开的再大，理论上输入的内容都可能比它还大 这样直接的line ++ 是不对的 fgets可以把回车符读入进来， 要根据这个判断line++ 然后要特别注意最后一行，有可能直接遇到feof而没有遇到回车，那就还需要加上遗爱湖特殊处理最后一行

user: user-2
content: 这个也没有特别的地方，只是繁琐了一些 写一个控制程序，用来读取字符流，一次一行，直到遇到EOF， 楼主没有明确来自文件还是来自键盘输入流 再写一个基于一个字符串（一行输入）的统计函数，在控制流程当中调用它，来统计所需的各个情况

user: user-3
content: 调用函数isupper(); islower();isdigit()，isspace()等等

user: user-1
content: 就是一行一行从标准输入读入统计就可以了 不知道你说使用EOF是指什么？是Ctrl+z还是说输入EOF作为输入结束的关键字？ for example int main(int argc, const char * argv[]) {     int chars=0, words=0, lines=0, whitespaces=0, uppercase=0, lowercase=0, digits=0, flag=0;     char buf[256];     while (1)     {         char *p = fgets(buf, sizeof(buf), stdin); //从标准输入读入行         if (p == NULL || buf[0] == '\n') break; //如果EOF或者没有输入数据则结束循环（如果是Ctrl+z则判断p==NULL就可以了）         lines++;          for (int i=0; i<strlen(buf); i++)         {             if (buf[i]>='0' && buf[i]<='9')             {                 digits++;             }             else if (buf[i]>='A' && buf[i]<='Z')             {                 uppercase++;                 flag++;             }             else if (buf[i]>='a' && buf[i]<='z')             {                 lowercase++;                 flag++;             }             else if (isspace(buf[i])) {                 whitespaces++;                 if (flag>0)                 {                     words++;                     flag = 0;                 }             }             chars++;         }     }     if (flag>0) words++;     printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t", chars, words, lines, whitespaces, uppercase, lowercase, digits); }