字符串,获取和做

时间:2013-03-11 13:52:30

标签: c string gets openvms

我正在用C做练习但是我遇到问题并且我想重复cicle(do 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上进行测试

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

答案 2 :(得分: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. 您的主要应该返回int类型,即使它只是return 0
  2. 您不应该使用gets(),即便如此gets() fgets(testo, sizeof(testo), stdin);永远不要使用gets()。这通常是一个很好的指示。 ;)所以用printf("\nThe text is composed by % characters\n", cch);
  3. 替换该行
  4. 你错过了一个性能指标:%d所以你得到的垃圾输出应该是{{1}}