我正在尝试与字符串,数组和指针相关的实验表。问题是"对存储在指针数组中的5个字符串单词进行排序。"
我尝试了很多,并在各种网站中搜索了问题的解决方案。我已经能够按字母顺序对字符串进行排序,但始终是字符串末尾的另一个字符串的一部分。
如果我输入的字符串如 笔记本电脑 和 comp 那么输出将是 comptop 和 笔记本电脑
主要代码是:
main()
{
char *str[10], *t;
int i,j;
for(i=0;i<5;i++)
{
scanf("%s",&str[i]);
}
for(i=0; i<5; i++)
{
for(j=i+1; j<5; j++)
{
if (strcmp(&str[j-1], &str[j]) > 0)
{
t=str[j];
str[j]=str[j-1];
str[j-1]=t;
}
}
}
printf("\n");
for(i=0;i<5;i++)
{
printf("%s\n",&str[i]);
}
}
答案 0 :(得分:1)
以下行是未定义错误的原因。
scanf("%s", &str[i]);
问题:
str[i]
的类型为char*
。 &str[i]
的类型为char**
。编译器应警告您使用给定格式%s
是错误的类型。
将字符串读入该地址将损坏您的堆栈并导致未定义的行为。
从语法上讲,你可以使用
scanf("%s", str[i]);
但除非为字符串分配内存,否则这将是问题。
您可以为堆或堆栈上的字符串分配内存。目前我们假设您不打算在字符串中保留超过99个字符。
使用堆栈中的内存:
char str[10][100], *t;
int i,j;
for(i=0;i<5;i++)
{
scanf("%99s", str[i]);
}
使用堆中的内存:
char* str[10], *t;
int i,j;
for(i=0;i<5;i++)
{
str[i] = malloc(100);
if ( str[i] != NULL )
{
scanf("%99s", str[i]);
}
}
确保在使用堆中的内存时调用free()
。
该行
if (strcmp(&str[j-1], &str[j]) > 0)
不正确,因为&str[j-1]
和&str[j]
的类型为char**
。再一次,你应该收到编译器关于它的警告。该行必须是:
if (strcmp(str[j-1], str[j]) > 0)
块:
{
t=str[j];
str[j]=str[j-1];
str[j-1]=t;
}
仅当您使用堆中的内存时,才会起作用。如果您使用堆栈中的内存,则需要使用strcpy()
在str
的元素之间移动数据。
该行
printf("%s\n",&str[i]);
应该是
printf("%s\n", str[i]);
到这个时候,你应该知道原因。