鱼C论坛

 找回密码
 立即注册
查看: 990|回复: 14

[已解决]求助一个while语句

[复制链接]
发表于 2020-3-14 20:41:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        for(i = 0; i < 1024; i++)
        {
                char *b = en[i];
                char *a = ch[i];
                printf("%s :",ch[i]);
                scanf("%s",a);
                do
                {
                        printf("%s :",ch[i]);
                        scanf("%s",a);
                }while(*a != *b);
               
                if(ch[i+1]=="end")
                {
                        printf("程序结束!\n");
                        system("pause");
                }
        }

为啥这个while语句成立的时候整个fou语句都直接终止了。
有点摸不着头脑,
最佳答案
2020-3-15 16:04:58
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define MAX 1024

  4. int main(void)
  5. {
  6.         char ch[3][MAX] = {"彩虹", "工厂", "end"};
  7.         char en[3][MAX] = {"rainbow", "factory", "end"};
  8.         char astr[MAX];
  9.         int i;
  10.        
  11.         for(i = 0; i < 3; i++)
  12.         {
  13.                 do
  14.                 {
  15.                         printf("%s:", ch[i]);
  16.                         scanf("%s", astr);
  17.                         getchar();
  18.                 }
  19.                 while(strcmp(astr, en[i]));
  20.                
  21.                 if(!strcmp(ch[i + 1], "end"))
  22.                 {
  23.                         printf("程序结束!\n");
  24.                         break;
  25.                 }
  26.         }
  27.       
  28.         return 0;
  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-14 20:59:06 | 显示全部楼层
你看你while循环后还有代码吗?
有,且只有一个判断了
程序肯定就结束了啊
还有,把代码发全
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 21:03:56 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 20:59
你看你while循环后还有代码吗?
有,且只有一个判断了
程序肯定就结束了啊

#include <stdio.h>

#define MAX 1024

int main(void)
{
        char *ch[] = {"彩虹","工厂","end"};
        char *en[128] = {"rainbow","factory","end"};
       
        int i,n = 0;

        for(i = 0; i < 1024; i++)
        {
                char *b = en;
                char *a = ch;
                printf("%s :",ch);
                scanf("%s",a);
                do
                {
                        printf("%s :",ch);
                        scanf("%s",a);

                }while(*a != *b);
               
                if(ch[i+1]=="end")
                {
                        printf("程序结束!\n");
                        system("pause");
                }
        }
       
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 21:05:22 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 20:59
你看你while循环后还有代码吗?
有,且只有一个判断了
程序肯定就结束了啊

如果while写在for语句里面,while执行完之后,是会直接结束整个for语句吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 21:07:27 | 显示全部楼层
言覃Jack 发表于 2020-3-14 21:05
如果while写在for语句里面,while执行完之后,是会直接结束整个for语句吗?

不是,可你后面没有语句啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 21:10:27 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 21:07
不是,可你后面没有语句啊

do while(*a != *b),while括号里面的是结束条件,执行完之后,不是应该执行i++,然后继续循环执行下面的语句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 21:12:25 | 显示全部楼层
言覃Jack 发表于 2020-3-14 21:10
do while(*a != *b),while括号里面的是结束条件,执行完之后,不是应该执行i++,然后继续循环执行下面的 ...

能给出一套输入用例吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 21:14:09 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 21:12
能给出一套输入用例吗?

就是加入先打印出ch[0] 的彩虹: 然后用户输入,如果等于en[0]里面的rainbow,如果不符合就继续打印彩虹
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 21:17:18 | 显示全部楼层
言覃Jack 发表于 2020-3-14 21:14
就是加入先打印出ch[0] 的彩虹: 然后用户输入,如果等于en[0]里面的rainbow,如果不符合就继续打印彩虹

可是你这程序也没先打印彩虹啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 21:19:59 | 显示全部楼层
for语句在执行dowhile 之前先打印了一次彩虹,然后scanf,之后do while 就判断是否正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-15 12:20:17 | 显示全部楼层
本帖最后由 就是要努力呀 于 2020-3-15 12:22 编辑

你的代码问题很多,全是警告和错误,你的编译器没有提醒你吗
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main(void)
  4. {
  5.         char *ch[] = {"彩虹","工厂","end"};
  6.         char *en[128] = {"rainbow","factory","end"}; //en[128] 你的这个数组指针里面有128个指针吗
  7.       
  8.         int i,n = 0;

  9.         for(i = 0; i < 1024; i++)
  10.         {
  11.                 char *b = en; 错误用法,指针指向数组指针应该用二重指针 光是这里就是错误,编译都不通过  char **b = en;
  12.                 char *a = ch; 同上
  13.                 printf("%s :",ch); 你要打印ch中的哪个值,ch有三个值,你到底要打印哪一个,如果你打印彩虹就printf("%s", *ch); 这些错误你自己没有发现吗,你的printf根本就没有打印ch的值
  14.                 scanf("%s",a); 错误用法,不能用scanf给char 型的指针赋值,你可以在初始化char型指针的时候给它赋值,但不能用scnaf给它让用户输入值,要用就用字符数组
  15.                 do
  16.                 {
  17.                         printf("%s :",ch); 同上
  18.                         scanf("%s",a); 同上

  19.                 }while(*a != *b);
  20.                
  21.                 if(ch[i+1]=="end")
  22.                 {
  23.                         printf("程序结束!\n");
  24.                         system("pause");
  25.                 }
  26.         }
  27.       
  28.         return 0;
  29. }
复制代码


综上你把代码的数组指针换成数组就ok了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-15 12:57:27 | 显示全部楼层
本帖最后由 言覃Jack 于 2020-3-15 13:14 编辑
就是要努力呀 发表于 2020-3-15 12:20
你的代码问题很多,全是警告和错误,你的编译器没有提醒你吗

综上你把代码的数组指针换成数组就ok了


#include <stdio.h>
#include <stdlib.h>

#define MAX 1024

int main(void)
{
        char *ch[] = {"彩虹","工厂","end"};
        char *en[] = {"rainbow","factory","end"};

        int i,n = 0;
        for(i = 0; i < MAX; i++)
        {
                char *b = en; //这里有en【i】    不知道为什么英文状态的【】 和里面的内容都显示不出来
                char *a = ch; //这里有ch【i】
                printf("%s :",ch); // 这里也有ch【i】但是复制之后不显示
                scanf("%s",a);
                do
                {
                        printf("%s :",ch); // 这里也有ch【i】但是复制之后不显示
                        scanf("%s",a);
                }while(*a != *b);
               
                if(ch[i+1]=="end")
                {
                        printf("程序结束!\n");
                        system("pause");
                }
        }
       
        return 0;
}
源代码是这样的,刚刚看了一眼,才发现复制有些地方少了,用的dev_C++编译器,没有任何提醒和报错,就是在执行do while 语句时,一旦俩者相等整个程序就结束了。其它环节都没有出现错误,就是for语句打印彩虹:  如果用户输入错误,就继续输出彩虹:,假如输入正确了整个for语句都停止循环了,然后就程序结束了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-15 16:01:42 | 显示全部楼层
本帖最后由 就是要努力呀 于 2020-3-15 16:07 编辑

1. scanf("%s",a); 错误用法,不能用scanf给char 型的指针赋值,你可以在初始化char型指针的时候给它赋值,但不能用scnaf给它让用户输入值,要用就用字符数组
2.字符串的对比不能用==号,应该使用<string.h>头文件里的strcmp函数
3.你把你的指针数组全部换成字符数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-15 16:04:58 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define MAX 1024

  4. int main(void)
  5. {
  6.         char ch[3][MAX] = {"彩虹", "工厂", "end"};
  7.         char en[3][MAX] = {"rainbow", "factory", "end"};
  8.         char astr[MAX];
  9.         int i;
  10.        
  11.         for(i = 0; i < 3; i++)
  12.         {
  13.                 do
  14.                 {
  15.                         printf("%s:", ch[i]);
  16.                         scanf("%s", astr);
  17.                         getchar();
  18.                 }
  19.                 while(strcmp(astr, en[i]));
  20.                
  21.                 if(!strcmp(ch[i + 1], "end"))
  22.                 {
  23.                         printf("程序结束!\n");
  24.                         break;
  25.                 }
  26.         }
  27.       
  28.         return 0;
  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-15 17:32:12 | 显示全部楼层
就是要努力呀 发表于 2020-3-15 16:01
1. scanf("%s",a); 错误用法,不能用scanf给char 型的指针赋值,你可以在初始化char型指针的时候给它赋值, ...

懂了,懂了,之前在做密码的时候一直都是用==来比较俩个是否相等,现在突然想做个字符串的,也下意识的使用==来比较是否相等了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 07:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表