字符串,获取并做而(Strings, gets and do while)

2019-08-17 11:20发布

我在做C中的工作,但我有当在一个问题,我想重复cicle(做一段时间),事实上,如果我是1型程序由顶级再次启动,但它不会停止在gets(testo); 。 我试过很多方法可以解决这个bug没有解决,谁能帮助我?

#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上测试

Answer 1:

你的第一个也是最明显的问题是与遗留换行符。 当您使用scanf()位置:

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

并使用%d格式specificer,功能正在寻找一个数字,当你输入一个号码真的是你正在进入一个号码和一个换行符

> 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. 你的主真的应该返回一个int类型,即使它只是一个return 0
  2. 你不应该使用gets() ,即使再手册页的gets()不要使用gets()函数。 这通常是一个很好的迹象都不到。 ;)因此,替换与该线fgets(testo, sizeof(testo), stdin);
  3. 在这里,您错过了性能specificer: printf("\nThe text is composed by % characters\n", cch); 所以你得到的垃圾产量,本来应该%d


Answer 2:

这是因为scanf在循环的结束通话不读的换行符。 相反,这个新行是由您的阅读gets电话。

一个简单的解决方案是将一个空间添加到的末尾scanf格式字符串,像这样:

scanf("%d ", &j);

这将使scanf跳过输入尾随空白。

另一种解决方案是把一个额外的fgetsscanf ,但随后没有在格式字符串添加额外的空间:

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

或者使用fgets获得行,然后用sscanf提取答案:

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


Answer 3:

或者你也可以尝试使用功能flushall(刚刚获得前()



文章来源: Strings, gets and do while