以下是我的代码。我正在尝试手动创建排序命令。我正在排序字符串。但我没有得到所需的输出。所以请帮助我。
#include<stdio.h>
main()
{
int i,j=0;
char temp[10][5];
char a[10][5]={"abc","xyz","pqrs","abcde","wxy"
"cd","lmnop","lmnkq","jkl","ghij"};
for(i=0;i<10;i++)
{
while(a[i][j]==a[i+1][j])
j++;
if(a[i][j]>a[i+1][j])
{
temp[i][j]= a[i][j];
a[i][j] = a[i+1][j];
a[i+1][j] = temp[i][j];
}
}
for(i=0;i<9;i++)
{
printf("%s\n",a[i]);
}
}
答案 0 :(得分:0)
您无法将c字符串与==,&gt;进行比较和&lt;
char a[5] = "abc";
char b[5] = "abc";
尝试此代码并查看条件将评估为false
if(a == b)
printf("they are different");
当你这样做时,你正在比较它们的地址......
使用string.h中的函数strcmp
if(strcmp(a, b) == 0)
printf("they are equal");
你不能使用=来分配,使用strcpy,也来自string.h
答案 1 :(得分:0)
这里有几件事情发生了:
您的一些字符串长度为5个字符,如果省略终止空字符,则只适合char[5]
。打印此类字符串也会打印以下字符串,因为内存布局是连续的。另请注意,只使用9个字符串初始化数组,因为字符串文字"wxy" "cd"
的串联与单个字符串"wxycd"
相同。
交换字符串时,必须交换所有字符串的字符,但可以跳过相同的字符。
您实现冒泡排序,但只进行一次更改相邻字符串。这还不足以对数组进行排序;你必须重复传递它,直到所有字符串都被排序。
您传递所有元素0到9,但随后访问a[i + 1]
,这是10,因此如果i == 9
超出范围。您可以调整右边界,也可以从i = 1
开始,然后找到a[i - 1]
。
所以,这是一个有效的版本:
#include <stdio.h>
int main()
{
int i, j;
int done = 0; /* mark whether we are done */
char a[10][6] = {
"abc", "xyz", "pqrs", "abcde", "wxy",
"cd", "lmnop", "lmnkq", "jkl", "ghij"
};
while (!done) {
done = 1; /* assume that we're done */
for (i = 0; i < 9; i++) {
j = 0;
while (a[i][j] == a[i + 1][j]) j++;
if (a[i][j] > a[i + 1][j]) {
while (j < 6) {
int temp = a[i][j];
a[i][j] = a[i + 1][j];
a[i + 1][j] = temp;
j++;
}
done = 0; /* we've swapped strings, so we need to do more */
}
}
}
for (i = 0; i < 10; i++) {
printf("%s\n", a[i]);
}
return 0;
}
代码仍然有点尴尬,因为它试图在一个大块中执行所有操作,并且它适用于静态数组边界和缓冲区大小。更好的排序只是将指针交换到字符串。