我是编程的初学者,我的讲座现在是关于指针的主题。我应该从键盘输入字符串(最多40个),然后按字母顺序排序。
要求是输入应该尽快打破"清空"输入字符串,指向字符串的指针应存储在数组中,排序时我应该将指针移动到字符串,我应该使用strcmp
函数。
我盯着写我的代码,想问你我是否走在正确的轨道上。我被建议将字符串存储在二维char
数组中,但问题是程序一直询问输入,即使我输入一个空行(我想,应该只按Enter
)。其次,我想问你关于排序字符串的最佳算法,因为我没有完全排序的经验。
编辑我在代码中做了一些更改,它提供了我预期的输出,按字母顺序对字符串进行排序。但是,如果我的代码中存在任何重大缺陷,并且可能会做出一些改进,我非常感谢C中更有经验的人的意见。在这部分我不明白指针被分配了一个地址,但是我创建指针数组的方式真的最有效吗?我知道我可以使用malloc
,但我想像我一样使用2D数组。
int count = 0;
char arr[40][100];
char (*poi[40])[100]; //Is the array of pointers declared right?
for (int i = 0; i < 40; i++)
{
fgets(arr[i], 101, stdin);
count++;
if (strcmp(arr[i], "\n") == 0)
{
break;
}
}
printf("\n");
for(int i = 0; i < count; i++)
{
poi[i] = &arr[i]; //I don't really understand how this part works, seems to work though
}
for(int i = 0; i < count - 1; i++)
{
for(int j = i + 1; j < count; j++)
{
if(strcmp(*poi[i], *poi[j]) > 0) //if I type here strcmp(arr[i], arr[j]) the output is not sorted properly, why?
{
char (*temp)[100] = poi[i];
poi[i] = poi[j];
poi[j] = temp;
}
}
}
//returns sorted strings
for (int i = 0; i < count; i++)
{
printf("%s", *poi[i]);
}
答案 0 :(得分:0)
在我看来,像你一样混合C和C ++的方式可能效果不好,尽管我不确定。如果您正在使用2D字符数组,那么它听起来就像您应该使用较低级别的C范例一样。在这种情况下,我将停止使用cin
和cout
,并切换为使用scanf
中的printf
和<stdio.h>
系列函数。如果您应该使用strcmp
那么这听起来肯定就像您应该去的路线。
至于排序,如果你正在使用C,那么如果您被允许使用它,请查看qsort
中的<stdlib.h>
功能。
答案 1 :(得分:0)
请改用std::cin.getline(arr[i], 100);
并检查字符串arr[i][0]
的第一个字符,以查看&#39; \ 0&#39;。所以你的循环应该是这样的:
for (int i = 0; i < 40; i++)
{
std::cin.getline(arr[i], 100);
count++;
if (arr[i][0] == '\0') //working
{
break;
}
}
答案 2 :(得分:0)
学校的关键是要学习,但要指出正确的方向......
Your loop
for (int i = 0; i < 40; i++)
{
cin >> arr[i];
你的循环需要40个字符。返回字符不会被cin选为字符。您必须添加空格或其他字符。
您在问什么是排序字符串的最佳算法。这真的取决于很多东西,但你可以从一个简单的冒泡排序开始,这可能接近你可能正在学习的东西。祝你好运。
答案 3 :(得分:0)
...但是我创建指针数组的方式真的最有效吗?
没有。它甚至不是正确的。在C和C ++中,数组:
但是,由于您的代码中多次调用malloc
,这两个条件的都被破坏了:
malloc
将在多个呼叫中分配连续的,未分段的元素序列poi
的指针(poi
是一个包含40个指针的数组,每个指针可能指向40 {{{ 1}} S)。在C语言中,如果你想要的东西大多数像指针数组一样使用,你应该使用类似的东西:
char
您还可以使用char (*poi)[40] = malloc(40 * sizeof *poi);
// poi[39][39] = ...
:
typedef
在C ++中,您通常会远离typedef char array_of_40_char[40];
array_of_40_char *poi = malloc(40 * sizeof *poi);
,因为有(更多)更清洁的选择。对于您的用例,您可能会被鼓励使用以下内容:
malloc
P.S。你有缓冲区溢出。您不应该尝试将100个字符读入只能存储40个的数组中。