我正在做一些家庭作业,并遇到了这个问题。
编写一个读取多行文本的程序,并打印一个表格,表示单字母单词的数量,双字母单词, 出现在文中的三个字母的单词等等。比如说 短语"是否在心中更高尚受到影响"
将包含
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
编写了代码,它的工作原理与此类似,但我知道由于漏洞,不应该使用它。
感谢任何帮助。 提前谢谢!
答案 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);