0

我正在用 C 做一个练习,但是在 和我想重复 cicle(做 while)时遇到问题,事实上,如果我输入 1,程序会从顶部重新开始,但它不会停止在gets(testo);. 我尝试了很多方法来解决没有解决方案的错误,有人可以帮助我吗?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

main(){
        int cch, cw, i, j, w, ord, f; //counter and index
        char testo[80];
        char alfa[50][25];
        char swap[25];

        do{     
                cch=0;
                cw=0;
                j=0;
                w=0;
                f=0;

                for(i=0;i<80;i++){
                        testo[i]='\0';
                }
                printf("Write the text:\n");
                gets(testo);

                //initialization 2d array
                for(i=0;i<50;i++){
                        for(j=0;j<25;j++){
                                alfa[i][j]='\0';
                        }
                }

                j=0;
                //Count word and characters
                if(testo[0]!='\0'){
                        cw=1;   
                        for(i=0;testo[i]!='\0';i++){
                                cch++;
                                if(testo[i]==' '){
                                        cw++;
                                        j++;
                                }
                        }
                }

                if(cch==j){
                        printf("You haven't written any word\n\n");
                }
                else{
                        //Don't count double space
                        for(i=0;i<cch;i++){
                                if(testo[i]==' ' && testo[i+1]==' '){
                                        cw--;
                                }
                        }

                        //Don't count as word if the text start with a space
                        if(testo[0]==' '){
                                cw--;
                                w--;
                        }

                        printf("\nThe text is composed by %d characters\n", cch);
                        printf("The text is composed by %d words\n", cw);

                        if(cw>0){
                                printf("\nUsed words:\n");
                                for(j=0;j<cch;j++){
                                        if(testo[j]==' ' && testo[j+1]==' '){
                                                //nothing to do        
                                        }
                                        else{
                                                if(testo[j]!=' '){
                                                        alfa[w][f]=testo[j];
                                                        f++;
                                                }
                                                else if(testo[j]=='\0'){
                                                        alfa[w][f]='\0';
                                                        f=0;
                                                        w=0;
                                                }
                                                else{
                                                        alfa[w][f]='\0';
                                                        w++;
                                                        f=0;
                                                }
                                        }
                                }

                                for(i=0;i<cw;i++){
                                        printf("%d> %s\n", i+1, &alfa[i]);
                                }

                                //order
                                f=1;
                                printf("\nWords used in alphabetical order:\n");
                                while(f==1){
                                        f=0;
                                        for(i=0;i<cw-1;i++){
                                                ord=strcmp(alfa[i],alfa[i+1]);
                                                if(ord>0){
                                                strcpy(swap,alfa[i]);
                                                strcpy(alfa[i],alfa[i+1]);
                                                strcpy(alfa[i+1],swap);
                                                f=1;
                                                }       
                                        }
                                }

                                for(i=0;i<cw;i++){
                                        printf("%d> %s\n", i+1, alfa[i]);
                                }
                        }
                }

        printf("\nDo you want write another text? (1=yes) -> ");
        scanf("%d", &j);

        }while(j==1);
}

我知道目前作为代码并没有得到很好的优化并且还有其他错误,但是我在这方面遇到了问题。

谢谢你。

PS:代码在OpenVMS上测试

4

3 回答 3

5

这是因为scanf循环结束时的调用没有读取换行符。相反,您的gets电话会读取此换行符。

一个简单的解决方案是在scanf格式字符串的末尾添加一个空格,如下所示:

scanf("%d ", &j);

这将scanf跳过输入中的尾随空格。

另一种解决方案是在fgets之后添加一个额外的scanf,但不要在格式字符串中添加额外的空格:

scanf("%d", &j);
fgets(testo, sizeof(testo), stdin);

或者使用fgets获取线路,然后使用sscanf提取答案:

fgets(testo, sizeof(testo), stdin);
sscanf(testo, "%d", &j);
于 2013-03-11T13:53:55.197 回答
1

或者您可以尝试在 gets() 之前使用函数flushall( )

于 2013-03-11T13:57:27.043 回答
1

您的第一个也是最明显的问题是左侧换行符。当你scanf()在这里使用时:

    printf("\nDo you want write another text? (1=yes) -> ");
    scanf("%d", &j);
}

并且您使用%d特定格式,该功能正在寻找一个数字,当您输入一个数字时,您实际上是在输入一个数字和一个换行符

> 1<enter key>   // which means on stdin you're getting   '1''\n'

scanf()只拿起 1 并离开你的gets()函数然后拿起的换行符,所以看起来它正在跳过输入。您需要做的就是使用该换行符,一种快速解决方法是使用它getchar()

    printf("\nDo you want write another text? (1=yes) -> ");
    scanf("%d", &j);
    getchar();
}

现在您的程序可以按预期运行。


其他注意事项:

  1. 你的 main 应该真的返回一个int类型,即使它只是一个return 0
  2. 你不应该使用gets(),即使手册gets()从不使用gets()。这通常是一个很好的迹象。;) 所以将该行替换为fgets(testo, sizeof(testo), stdin);
  3. 你在这里错过了一个性能细节:printf("\nThe text is composed by % characters\n", cch);所以你得到了垃圾输出,那应该是%d
于 2013-03-14T14:11:52.287 回答