鱼C论坛

 找回密码
 立即注册
查看: 4068|回复: 16

一个小c程序,无法得出正确结果

[复制链接]
发表于 2013-4-5 17:17:58 | 显示全部楼层 |阅读模式
9鱼币
//就是输入一个字符串,然后输出一个字符串,但是要求是不可以有 重复的字符。不知道这个程序哪里错了。。。
include <stdio.h>
int main( )
{
char ch,a[30];
int i=0,j;

while((ch=getchar())!='\n')
   {
   for(j=0;j<i;j++)
   {
   while(a[j]==ch)
           {
   ch=getchar();
               j=0;
   printf("%c\n",a[j]);
               break;
   
   }
   }
   a[i]=ch;
   i++;
  
   }

最佳答案

查看完整内容

那个。getchar不是及时存储的,而是按回车后才能进行存储 也就是没按回车前你什么也判断不到 应该说逻辑上你应该没错,但是getchar你没了解清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-5 17:17:59 | 显示全部楼层

那个。getchar不是及时存储的,而是按回车后才能进行存储
也就是没按回车前你什么也判断不到
应该说逻辑上你应该没错,但是getchar你没了解清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-5 17:32:24 | 显示全部楼层
少了#号和一个},由于是int main()所以还得加个return
当然你程序逻辑本身就是错的,等等改改
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char ch,a[30];
  5. int i=0,j;

  6. while((ch=getchar())!='\n')
  7.    {
  8.    for(j=0;j<i;j++)
  9.    {
  10.            while(a[j]==ch)
  11.            {
  12.                    ch=getchar();
  13.                    j=0;
  14.                    printf("%c\n",a[j]);
  15.                    break;
  16.                   
  17.            }
  18.    }
  19.    a[i]=ch;
  20.    i++;
  21. }
  22.    
  23.         return 0;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-5 17:44:39 | 显示全部楼层
友情帮顶~     
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-5 18:42:56 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-4-5 22:45 编辑

我写的太麻烦了,仅供参考。。
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5.         char a[30];
  6.         int j,y,i=0;/*清除重复部分用的变量*/
  7.         int cl1=0,cl2=0;/*处理调整顺序的变量*/
  8.         int size1;
  9.         int size2;/*记录去掉重复后的长度*/
  10.         gets(a);/*从键盘缓冲区获取一个字符串给a数组*/
  11.         size1=strlen(a);/*获取字符串长度*/
  12.         size2=size1;
  13.                 for(y=0;y<=size1;y++)
  14.                 {
  15.                 for (j=i+1;j<=size1;j++)
  16.                 {
  17.                                 if(a[i]==a[j])
  18.                                 {
  19.                                         a[j]=-1;/*在重复的地方先放个垃圾,等等处理*/
  20.                                         --size2;
  21.                                 }
  22.                 }
  23.                
  24.                         i++;
  25.                         while(a[i]==-1)/*防止取到处理过的*/
  26.                         {
  27.                                 i++;
  28.                         }
  29.                 }
  30.                 /*到这里把重复的搞掉了,开始把后面没重复的调整到前面来*/


  31.                 while(size2!=0)
  32.                 {
  33.                         while(a[cl1]!=-1)/*找到最前面=-1的地方来被后面没重复的字符替换掉*/
  34.                         {
  35.                                 cl1++;
  36.                         }
  37.                                 cl2=cl1+1;/*从第一个-1的位置后面开始找*/
  38.                
  39.                         while(a[cl2]==-1)/*找到后面第一个需要调整位置的字符*/
  40.                         {
  41.                                 cl2++;
  42.                         }
  43.                         a[cl1]=a[cl2];
  44.                         a[cl2]=-1;
  45.                         --size2;
  46.                 }
  47.                 /*到这里虽然后面还有一堆-1但是打印不出来所以不要紧*/
  48.                 printf("%s\n",a);

  49. return 0;
  50. }
复制代码
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-6 10:10:48 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-4-5 17:32
少了#号和一个},由于是int main()所以还得加个return
当然你程序逻辑本身就是错的,等等改改

那可以麻烦你和我说下我的逻辑哪里错了吗?我看了好久都不知道哪里错了
我是这样想的:
1当读取字符不是回车键时进行循环;否则退出
2检索最新读取的字符是否和已经存储了的字符相同;若是则进行第三步,否则进行第四步。
3进入另一个循环继续取下一新的字符,然后退出这个循环。进行第三步。
4将最新获得的字符存储到下一个数组元素中,继续进行第一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-6 12:33:37 | 显示全部楼层
  1. #include<stdio.h>

  2. #define MAXSAVE 27   //定义最大存储字符为26个字母,最后一个设置为0

  3. int main()
  4. {
  5.         int c,i,j;
  6.         int cs[MAXSAVE];

  7.     int search(int c,int cs[]);

  8.                 for (i=0;i<MAXSAVE;i++)
  9.                         cs[i]=0;

  10.                 i=0;

  11.         while ((c=getchar())!='\n')
  12.         {
  13.                 j=search(c,cs);
  14.                 if (j==0)
  15.                 {
  16.                         cs[i]=c;
  17.             i++;
  18.                 }
  19.                        
  20.         }
  21.     i=0;
  22.         while (cs[i]!=0)
  23.         {
  24.          putchar(cs[i]);
  25.                  i++;
  26.         }
  27.         putchar('\n');
  28.         return 0;
  29. }

  30. int search(int c,int cs[])
  31. {
  32.     int i=0;
  33.         while(cs[i]!='\0')
  34.         {
  35.                 if (c==cs[i])
  36.                 {
  37.                         break;
  38.                 }
  39.                 i++;
  40.         }
  41.         if (c==cs[i])
  42.                 return 1;
  43.         else
  44.         return 0;
  45. }
复制代码
抱歉。我赶着上学了。今天又要滚回学校了。测试好使。你自己看看吧。{:7_168:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-6 12:40:57 | 显示全部楼层
楼主的代码弄得有点乱....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-6 14:30:33 | 显示全部楼层
woailonglonga 发表于 2013-4-6 10:10
那可以麻烦你和我说下我的逻辑哪里错了吗?我看了好久都不知道哪里错了
我是这样想的:
1当读取 ...


你这个让我想到我那个代码放完一堆-1垃圾后的调整顺序处理方法,更改下
这样应该会比较好理解
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5.         char a[30];
  6.         char newa[30]={0};/*新数组*/
  7.         int j,y,i=0;/*清楚重复部分用的变量*/
  8.         int cl1=0,cl2=0;/*处理调整顺序的变量8*/
  9.         int size1;
  10.         int size2;/*记录去掉重复后的长度*/
  11.         gets(a);/*从键盘缓冲区获取一个字符串给a数组*/
  12.         size1=strlen(a);/*获取字符串长度*/
  13.         size2=size1;
  14.                 for(y=0;y<=size1;y++)
  15.                 {
  16.                 for (j=i+1;j<=size1;j++)
  17.                 {
  18.                                 if(a[i]==a[j])
  19.                                 {
  20.                                         a[j]=-1;/*在重复的地方先放个垃圾,等等处理*/
  21.                                         --size2;
  22.                                 }
  23.                 }
  24.                
  25.                         i++;
  26.                         while(a[i]==-1)/*防止取到处理过的*/
  27.                         {
  28.                                 i++;
  29.                         }
  30.                 }
  31.                 /*到这里把重复的搞掉了,开始把后面没重复的调整到前面来*/


  32.         
  33.                 while(1)
  34.                 {
  35.                         if(a[cl1]==-1)/*如果是垃圾数据就取下一位*/
  36.                         {
  37.                                 cl1++;
  38.                         }
  39.                         else/*如果不是垃圾数据就放到新数组*/
  40.                         {        
  41.                                 newa[cl2]=a[cl1];
  42.                                 cl2++;
  43.                                 cl1++;
  44.                                 --size2;
  45.                         }
  46.                         if(size2==0)/*如果处理完了*/
  47.                         {
  48.                                 break;
  49.                         }
  50.                 }
  51.                
  52.                 printf("%s\n",newa);

  53. return 0;
  54. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-6 15:05:54 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-4-5 17:32
少了#号和一个},由于是int main()所以还得加个return
当然你程序逻辑本身就是错的,等等改改

呃。。很谢谢你帮我写的程序,我也不是故意拖着问各种问题,我只是想知道我的程序是在哪里出了问题,为什么会出现这样的问题,如果在我自己的程序基础上改的话,要怎样改才能避免之前出现的问题。我刚刚把程序稍微修改了一下,我自己测试后没有什么问题,可以麻烦你最后再帮我看一下不?

#include <stdio.h>
int main()
{
char ch,a[30];
int i=0,j;

ch=getchar();
while(ch!='\n')
   {
   for(j=0;j<i;j++)
   {
           if(ch=='\n')
                   break;
           while(a[j]==ch)
           {
                   ch=getchar();
                   j=0;
                   //printf("%c\n",a[j]);
                   break;
                  
           }
   }

   if(ch=='\n')
           break;
   a=ch;
   i++;
   ch=getchar();
}
   a='\0';
   printf("%s\n",a);

        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-6 15:10:00 | 显示全部楼层
Potato丶 发表于 2013-4-6 12:33
抱歉。我赶着上学了。今天又要滚回学校了。测试好使。你自己看看吧。

很谢谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-6 15:51:15 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-4-6 15:55 编辑
woailonglonga 发表于 2013-4-6 15:05
呃。。很谢谢你帮我写的程序,我也不是故意拖着问各种问题,我只是想知道我的程序是在哪里出了问题,为什 ...

那个你a这个数组应该不能直接a=ch吧
还有你好像忘了看我6l的帖子,那个getchar这个函数需要按回车ch才能取到值
但一按回车你程序就结束了什么也没做好像。
那个有问题问不要紧,我现在对采纳率已经无所谓了
我现在在外面没办法测试,抱歉啦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-6 19:26:27 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-4-6 15:51
那个你a这个数组应该不能直接a=ch吧
还有你好像忘了看我6l的帖子,那个getchar这个函数需要按回车ch才能 ...

额。。那个直接用a的地方我可以说是没复制得好不。。。。。
我大概知道你说的getchar()那个意思了,是不是不负责输出?
那个我在后面加了个printf。
如果不方便就算了。还是很感谢的说{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-6 20:43:09 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-4-6 20:44 编辑
woailonglonga 发表于 2013-4-6 19:26
额。。那个直接用a的地方我可以说是没复制得好不。。。。。
我大概知道你说的getchar()那个意思了,是 ...

没复制好没事啦,我也经常犯这种错误滴。
getchar我的意思是,举个例子吧,你写个hello world程序,在结尾加个ch=getchar()作为暂停
你会发现你狂按abcdwj或者空格程序都不会结束,只有按回车才会结束
也就是说只有按回车时才会进行你程序的循环
而你不可能输一个字母按一次回车,再输一个字母再按一个回车吧,肯定是一次性输一串的把
所以这里选择用gets
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-6 22:33:50 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-4-6 20:43
没复制好没事啦,我也经常犯这种错误滴。
getchar我的意思是,举个例子吧,你写个hello world程序,在结 ...

了解了~thank u{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-20 20:56:30 | 显示全部楼层
woailonglonga 发表于 2013-4-6 22:33
了解了~thank u

getchar()完全可以实现你说的功能。没必要敲一个字母按一下回车。

当检测到输入终止字符(比如你写的是回车)时,getchar()才会从字符流中逐个读取字符。

{:7_169:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-21 08:41:36 | 显示全部楼层
Potato丶 发表于 2013-4-20 20:56
getchar()完全可以实现你说的功能。没必要敲一个字母按一下回车。

当检测到输入终止字符(比如你写的是 ...

非常感谢{:7_168:}

评分

参与人数 1鱼币 +5 收起 理由
Potato丶 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-28 10:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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