Струны, получай и делай пока
Я делаю упражнение на 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();
}
Теперь ваша программа работает так, как вы ожидаете.
Другие вопросы примечания:
- Ваша главная должна действительно возвращать
int
типа, даже если это простоreturn 0
- Вы не должны использовать
gets()
, даже тогда страница дляgets()
говорит Никогда не используйте gets(). Обычно это хороший знак, чтобы не делать этого.;) Так что замените эту строку наfgets(testo, sizeof(testo), stdin);
- Вы пропустили спецификатор производительности здесь:
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 ()