我正在用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上进行测试
答案 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();
}
现在你的程序按预期工作。
其他注意事项:
int
类型,即使它只是return 0
gets()
,即便如此gets()
fgets(testo, sizeof(testo), stdin);
说永远不要使用gets()。这通常是一个很好的指示。 ;)所以用printf("\nThe text is composed by % characters\n", cch);
%d
所以你得到的垃圾输出应该是{{1}}