| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3281 人关注过本帖
标题:进入死循环的一个程序
只看楼主 加入收藏
wxz11191975
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2011-6-20
结帖率:85.29%
收藏
已结贴  问题点数:5 回复次数:7 
进入死循环的一个程序
题目要求是:对字符数组中的字母按由大到小的字母顺序进行排列:
#include <stdio.h>
#include <stdlib.h>

#define NUM 26

void arrout1(char a[],int n)
{int i;
 for (i=0;i<n;i++)
 {a[i]=getchar();
 printf("%2c",a[i]);}
 putchar('\n');}
 
void arrout2(char a[],int n)
{int i;
 for (i=0;i<n;i++)
 printf("%2c",a[i]);
 putchar('\n');}
 
void arrsort(char *a,int n)
{int i,j,p,t;
 for(j=0;j<n-1;j++)
 {p=j;
  for(i=j+1;i<n;i++)
    if(a[p]<a[i])p=i;
  if(p!=j)
   {t=a[j];a[j]=a[p];a[p]=t;}
 }
}

main()
{char a[NUM];
 printf("output the characters:\n");
 arrout1(a,NUM);
 arrsort(a,NUM);
 printf("output the characters after sorted:\n");
 arrout2(a,NUM);
 system("PAUSE");   
  return 0;
}
可是程序走到arrsort函数那儿不走了,貌似是进入了死循环,可是我自己看不出来。。。
搜索更多相关主题的帖子: cha 
2011-07-31 09:41
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:3 
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define NUM 26
void arrsort(char *a,int n)
{   int i,j,p,t;
    for(j=0;j<n-1;j++)
    { p=j;
      for(i=j+1;i<n;i++)
        if(a[p]<a[i])p=i;
      if(p!=j)
       {t=a[j];a[j]=a[p];a[p]=t;}
    }
}

main()
{char a[NUM];
printf("output the characters:\n");
gets(a);
arrsort(a,NUM);
printf("output the characters after sorted:\n");
puts(a);
system("PAUSE");   
  return 0;
}
是你输入有问题  没进入死循环

                                         
===========深入<----------------->浅出============
2011-07-31 09:49
wxz11191975
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2011-6-20
收藏
得分:0 
回复 2楼 laoyang103
用你的程序做了以后是有结果输出了,可是我原来的程序错在哪儿了呢?
for (i=0;i<n;i++)
 {a[i]=getchar();
 printf("%2c",a[i]);}
用这样的方式去得到字符串的输入虽然笨了一点,可是它错在哪儿了呢?
麻烦帮我指点一下。谢谢!
2011-07-31 10:54
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
楼主自己先解释一下你的程序想实现什么目的、如何实现的?

授人以渔,不授人以鱼。
2011-07-31 11:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
2楼也不读明白程序的意图就帮他,帮得了吗?呵呵~我就想知道他arrout1()中强制要输入NUM个字符是什么意思?输不够26个字符,程序会怎么做?

授人以渔,不授人以鱼。
2011-07-31 11:29
wxz11191975
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2011-6-20
收藏
得分:0 
回复 5楼 TonyDeng
是哦,我知道了,是因为我没有输满26个字符,所以程序不走了。谢谢!
所以,我那个获得字符的方式是没错的,但不要给字符数加上限,用 gets()去做,输入多少就排多少。是不是这样是对的?

还有,二楼的程序运行过程中,最后的排序打印中总会出现几个没输入过的字符,那是什么原因的?
2011-07-31 11:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 6楼 wxz11191975
是的,你强制输入26个字符,输不够就死等,你以为是死循环,其实不是。2楼给你改了输入部分,可以不足26个字符就进入排序步骤,但你的排序函数仍然是强制对26个字符排序的(注意此时你实际上并没有输入26个字符给它),所以多出来的部分,是内存中本来不应让你访问的数据——在a字符串结束处'\0'后面补足26个int数据。你这个程序问题多多,自己仔细推敲一下吧。

授人以渔,不授人以鱼。
2011-07-31 11:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
给你改一下:

程序代码:
#include <stdio.h>
#include <string.h>

 
#define NUM        2048

void SelectSort(char* cString, int iElementNumber);

int main(void)
{
    char cString[NUM];

    while (true)
    {
        printf("Input your string(First press the [Enter] key to end this program):");
        if (gets_s(cString) != NULL)
        {
            if (cString[0] != '\0')
            {
                SelectSort(cString, strlen(cString));
                printf("Output the characters after sorted:%s\n", cString);
            }
            else break;
        }
        else break;
    }

    return 0;
}

// 用直接选择排序算法(Straight Select Sorting)排序
void SelectSort(char* cString, int iElementNumber)
{
    int iStart;        // 循环起始位置
    int iCount;        // 循环计数器
    char cTemp;        // 交换值

    for (iStart = 1; iStart < iElementNumber; iStart++)
    {
        for (iCount = iStart; iCount < iElementNumber; iCount++)
        {
            if (cString[iCount] < cString[iStart-1])
            {
                cTemp = cString[iStart-1];
                cString[iStart-1] = cString[iCount];
                cString[iCount] = cTemp;
            }
        }
    }

}


这是从小到大排,你要从大到小排,自己看看改哪里?

[ 本帖最后由 TonyDeng 于 2011-7-31 15:33 编辑 ]

授人以渔,不授人以鱼。
2011-07-31 15:23
快速回复:进入死循环的一个程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.091358 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved