我创建了一个冒泡排序程序。它以无限循环结束。 我在地方添加了注释,以便代码易于理解。 欢迎任何有关如何缩小代码的建议。
我正在调试程序并找到了这个 -
当stdin是" ccbbaa"并且在最终输入(aabbcc)和temp(aabbcc)相同的一些递归之后,然后在执行strcmp()的条件之后,' temp'被改为" baabcc"。
出现这种情况的原因有哪些? - 这就是无限循环的原因。
字符数组是否有' \ 0'最后(将输入复制到临时)?
我通过使用for循环而不是strcmp()解决了这个问题。调查为什么strcmp()目前无法正常工作。
更新的代码可用 - http://ideone.com/4Bdblh(已解决)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
void sort(char* input)
{
const int length = strlen(input);
int j = length -1;
char temp[length];
for(int i=0; i<length; i++)
{
temp[i]= *(input+i);
}
while(j)
{
if((int)*(input+1) < (int)*(input))
{
char temp1;
temp1 = *(input);
*input = *(input + 1);
*(input + 1) = temp1;
}
input++;
j--;
}
input = input - length +1;
while(strcmp(temp,input))
{
sort(input);
}
}
int main()
{
char* input = malloc(sizeof(char)*1000);
scanf("%[^\n]%*c",input);
sort(input);
printf("%s",input);
return 0;
}
答案 0 :(得分:1)
使用数组和循环答案 -
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#define MAX 1000
void sort(char input[])
{
const int length = strlen(input);
int j = length -1;
char temp[length];
for(int i=0; i<length; i++)
{
temp[i]= input[i];
}
int l=0;
while(j)
{
if(input[l+1] < input[l])
{
char temp1;
temp1 = input[l];
input[l] = input[l+1];
input[l+1] = temp1;
}
l++;
j--;
}
for(int k=0; k<length; k++)
{
if(temp[k]!=input[k])
{
sort(input);
}
}
}
int main()
{
char input[MAX];
scanf("%[^\n]%*c",input);
sort(input);
printf("%s",input);
return 0;
}
答案 1 :(得分:0)
在C中,字符串只是一个以0结尾的字符数组。
所有字符串函数都假设char数组以零结尾。
strcpy复制包含末尾0分隔符的字符串。因此,目标必须有足够的空间用于字符串加零。
strlen返回字符串的长度,因此目标必须至少为strlen(输入)+1 long。
如果你在一个循环中复制字符串,那么你一定不要忘记添加结束零。
我真正得到的是为什么要使它递归并进行字符串比较以检测完成。你可以实现两个从0到长度的嵌套循环--2。它保证它最终会被排序。
如果您想让它自适应,只需存储您交换的最后一个位置。你不需要进一步循环。
答案 2 :(得分:0)
当stdin为“ ccbbaa”并经过几次递归后,当最终输入(aabbcc)和temp(aabbcc)相同时,则在执行strcmp()条件后,将'temp'的值更改为“ baabcc”
- 为什么会发生这种情况? —这就是无限循环的原因。
看起来'temp'的值已更改为“ baabcc” ,因为该函数返回到先前的递归级别,其中本地temp
具有与以前相同的值。无限循环的主要原因是由于while(strcmp(temp,input))
一次又一次地比较了未排序的旧temp
。
- 字符数组的末尾是否有“ \ 0”(将输入复制到temp时)?
越野车代码中的temp
数组还没有;你本可以写
char temp[length+1];
strcpy(temp, input);
或仅使用strncmp()
而不是strcmp()
。
因此,要使程序正常运行,只需进行更改即可
while(strcmp(temp,input))
到
if (strncmp(temp, input, length))