Струны, получай и делай пока

Я делаю упражнение на C, но у меня есть проблема, когда на и я хочу повторить цикл (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 ответа

Решение

Ваша первая и самая очевидная проблема - с новой строкой. Когда вы используете 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() говорит Никогда не используйте gets(). Обычно это хороший знак, чтобы не делать этого.;) Так что замените эту строку на fgets(testo, sizeof(testo), stdin);
  3. Вы пропустили спецификатор производительности здесь: printf("\nThe text is composed by % characters\n", cch); так что вы получаете вывод мусора, это должно было быть %d

Это потому что 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);

Или вы можете попробовать использовать функцию flushall() непосредственно перед get ()

Другие вопросы по тегам