该程序应该比较字符串并按字母顺序放置它们,但最后的printf语句打印出垃圾......我在哪里错了?
我已经使用了一个指向字符串的指针数组并在开始时声明它们,我甚至尝试使用temp作为数组而不是指针stil不能正常工作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int j;
int i;
char *temp;
char *string[5] = {"ibrahim","laura","peter","degea"};
for ( i = 0; i< 4;i++)
printf("%s\n", string[i]); //allocating memory
for( i = 0; i< 10 ;i++)
string[i] = (char*)malloc (30 * sizeof(char));
temp = (char*)malloc(30*sizeof(char));
for ( i=0; i< 3; i++)
for(j =i+1; j<4; j++)
{
if(strcmp(string[i], string[j]) > 0)
{
strcpy(temp, string[i]);
strcpy(string[i], string[j]);
strcpy(string[j], temp);
}
}
for (i = 0; i< 4; i++)
{
printf("%s\n",string[i]);
puts("\n");
}
free(string);
free(temp);
return 0;
}
答案 0 :(得分:1)
string[i] = (char*)malloc (30 * sizeof(char));
这会覆盖现有的初始化值。
for( i = 0; i< 10 ;i++)
temp = (char*)malloc(30*sizeof(char));
什么?你是在一个指针上多次分配内存10次?
原始帖子丢失(阅读已编辑)。当你读到这个答案的时候,Jonathan Leffler先生和这张海报在这个世界上看起来都像个绝对的傻瓜。
答案 1 :(得分:1)
代码最初销毁了它的数据数组(通过分配新的指针)。现在它似乎通过分配temp
四次来释放内存(但Jeevan的编辑以缩进形式恢复旧代码)。旧代码为字符串分配空间但从未初始化它们(事先抛弃了数组中的值)。
NB:在您阅读评论时,对代码的任何评论都很容易失效 - 问题中的代码可能已经更改。
for (i = 0; i < 10; i++)
string[i] = malloc(30);
此代码践踏string
数组的范围(维度为5)。它也会丢失最初在数组中的数据。
您需要使用strcmp()
来比较字符串,但您只需要交换指针而不是使用strcpy()
。
// allocating memory
声明旁边的评论printf()
也具有误导性。
这有机会工作。请注意,没有内存分配:
#include <stdio.h>
#include <string.h>
int main(void)
{
int j;
int i;
char *string[] = { "ibrahim", "laura", "peter", "degea" };
for (i = 0; i < 4; i++)
printf("%s\n", string[i]);
for (i = 0; i < 3; i++)
{
for (j = i+1; j < 4; j++)
{
if (strcmp(string[i], string[j]) > 0)
{
char *temp = string[i];
string[i] = string[j];
string[j] = temp;
}
}
}
for (i = 0; i < 4; i++)
printf("%s\n",string[i]);
return 0;
}
输出:
ibrahim
laura
peter
degea
degea
ibrahim
laura
peter
评论:不要尝试使用此排序算法对数千个字符串进行排序。
答案 2 :(得分:0)
您正在使用malloc覆盖现有的字符串数组内容,这也是10次。 请在代码中使用大括号以便更好地理解
for( i = 0; i< 10 ;i++)
string[i] = (char*)malloc (30 * sizeof(char));
temp = (char*)malloc(30*sizeof(char));
可以写成
for( i = 0; i< 10 ;i++) // why to allocate memory ten times, that too overwriting
{
string[i] = (char*)malloc (30 * sizeof(char));
}
temp = (char*)malloc(30*sizeof(char));
答案 3 :(得分:0)
当你宣布: char * string [5] = { “易卜拉欣” “劳拉”, “彼得”, “degea”};
指针* string [0]到* string [3]分配给内存中的地址,其中将存储init值“ibrahim”,“laura”......
当你使用malloc函数作为指针字符串[i] =(char *)malloc(30 * sizeof(char)); 指针* string [0]到* string [4]将被分配给内存中的另一个地址。所以这些地址的值与你初始化的值不同(ibrahim,laura)。
你应该使用静态数组而不是动态如下
char temp;
char string [5] = { “易卜拉欣” “劳拉”, “彼得”, “degea”};
删除所有malloc,free函数。