用选择法对一个数组进行排序
想请问大家为什么这个代码无法输出呢?
#include
#include
#include
int main()
{
char a[10],t;
int i,x,min;
gets(a);
for(x=0;x<9;x++)
{ min=x;
for(i=x+1;i<10;i++)
{
if (a[min]>a[i])
min=i;
}
t=a[min];
a[min]=a[x];
a[x]=t;
}
puts(a);
return 0;
}
a数组大小是10,但gets(a)输入的字符串长度不一定是10啊。你怎么for循环就对整个数组排序呢?这样肯定将字符串结束符就排序到数组第一个字符了,自然用puts输出啥也没有
根据你提供的代码,我看到你使用了 gets(a) 和 puts(a) 来实现输入和输出。但是需要注意的是,gets() 函数已经被标记为不安全,IDE可能会报警告,因此在输入字符串时建议使用相对安全的 fgets() 函数。同时,在输出字符串时需要确保字符串以空字符 \0 结尾,否则可能出现无法预料的问题。
此外,如果你的输入字符串中包含非数字字符(例如空格、换行符等),排序结果可能会出现异常。因此,建议在输入时检查和过滤非数字字符,以保证程序正常运行。
根据以上建议,你可以尝试修改代码如下:
如果输入的字符串全是数字字符,那么这个程序会将它们升序排列并输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> // 引入ctype.h头文件
int main()
{
char a[10], t;
int i, x, min;
fgets(a, 10, stdin); // 使用相对安全的fgets()函数读取字符串
a[strcspn(a, "\n")] = '\0'; // 去除多余的换行符
for (x = 0; x < 9; x++)
{
min = x;
for (i = x + 1; i < 10; i++)
{
if (isdigit(a[i]) && a[min] > a[i]) // 检查并过滤非数字字符
min = i;
}
t = a[min];
a[min] = a[x];
a[x] = t;
}
printf("%s", a); // 在输出字符串时,确保以'\0'结束
return 0;
}
在百分号(%)与格式码之间添加一个整数可以限制读入的最大字符数,超出字符串的部份将留在缓冲区等待下次读取。
例如:向变量A
读入不多于 20 个字符时的代码:
char A[20];
scanf("%20s",&A);
注意读入字符串需要注意数组长度的设置,上面的例子实际上是不严谨的,因为读取到结束时候虽然会忽略空白符,但是会添加"\0"用来标识结束,如果刚好填满数组的话,会导致内存溢出,从而可能出现一些未知错误,正确的写法应该如下(假设需要读入最长20个字符的字符串):
char A[21];
scanf("%20s",&A);
最后,这种方式不仅仅局限于输入字符串,限制的长度只是限制了该方法一次性能从缓冲区看到的字符串长度,也就是说,还可以用于接收整数,浮点数等
int a;
scanf("%2d",&a);
/**
* 输入"12345",运行后 a=12
*/