退出Do While循环

时间:2018-03-22 17:53:09

标签: c loops fgets gets

我正在做一些家庭作业,并遇到了这个问题。

  

编写一个读取多行文本的程序,并打印一个表格,表示单字母单词的数量,双字母单词,   出现在文中的三个字母的单词等等。比如说   短语"是否在心中更高尚受到影响"

     

将包含

     

1个字母的单词:0

     

2个字母的单词:2

     

3个字母的单词:1

     

4个字母的单词:2个(包括' tis)

     

5个字母的单词:0

     

6个字母的单词:2

     

7个字母的单词:1

我的问题代码如下。

^[^.]+.ts$

^        ---> start of line
[^.]+    ---> match anything which is not '.' (match atleast one character)
^[^.]+   ---> match character until first '.' encounter
.ts      ---> match '.ts'
$        ---> end of line
.ts$     ---> string end with '.ts'

我的问题是退出第17-33行的do while循环。这是我第一次使用#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXDIMENSIONS 1000 //set max dimensions #define MAXLENGTH 1000 //set max length void separate(char stringArray[][MAXLENGTH], int words); void printTable(char stringArray[][MAXLENGTH], int c); int main(int argc, char** argv) { char txt[MAXLENGTH]; char *token; char mat[MAXDIMENSIONS][MAXLENGTH]; int i=0,wordcount=0; do{ printf(">>>Write and press enter (EXIT for end of program)<<< : ",49); fgets(txt,sizeof txt,stdin); if(strcmp(txt,"EXIT")!=0) { token=strtok(txt," "); strcpy(mat[i],token); i++; while(token!=NULL){ token=strtok(NULL, " "); if(token!=NULL){ strcpy(mat[i],token); i++; } } } }while(strcmp(txt,"EXIT")!=0); separate(mat,i); printTable(mat,i); return (EXIT_SUCCESS); } // end of main void separate(char stringArray[][MAXLENGTH], int words){ for(int i=0; i<words; i++){ for(int j=0; j<strlen(stringArray[i]); j++){ if((stringArray[i][j]<65 && stringArray[i][j]!=39) || (stringArray[i][j]>90 && stringArray[i][j]<97)|| stringArray[i][j]>122){ for(int g=j; g<strlen(stringArray[i]); g++){ stringArray[i][g]=stringArray[i][g+1]; } } } } } void printTable(char stringArray[][MAXLENGTH], int c){ int max; int value=0,j; max=strlen(stringArray[0]); for(int i=1; i<c; i++){ if(max<strlen(stringArray[i])){ max=strlen(stringArray[i]); } } printf("\n***********WORD LENGTH READER***********\n"); printf("| LENGTHS || VALUES | \n"); for(j=1; j<=max; j++){ for(int i=0; i<c; i++){ if(strlen(stringArray[i])==j){ value++; } } printf("| %d || %d | \n",j,value); value=0; } printf("\n****************************************\n"); } ,我相信这可能是造成这个问题的原因。我使用fgets编写了代码,它的工作原理与此类似,但我知道由于漏洞,不应该使用它。

感谢任何帮助。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

由于fgets也会读取换行符,因此换行符将无法满足您的退出条件。您可以在支票中添加换行符"EXIT\n",也可以在fgets之后修改换行符。

以下示例也使循环更简单:

do {
    fgets(txt,sizeof txt,stdin);
    char *p= strrchr(txt,'\n'); if (p) *p= '\0';
    if(strcmp(txt,"EXIT")==0)
        break;
    //....
while(1);