使用指针

时间:2017-11-25 20:51:38

标签: c arrays sorting pointers

我是编程的初学者,我的讲座现在是关于指针的主题。我应该从键盘输入字符串(最多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]);
}

4 个答案:

答案 0 :(得分:0)

在我看来,像你一样混合C和C ++的方式可能效果不好,尽管我不确定。如果您正在使用2D字符数组,那么它听起来就像您应该使用较低级别的C范例一样。在这种情况下,我将停止使用cincout,并切换为使用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选为字符。您必须添加空格或其他字符。

您在问什么是排序字符串的最佳算法。这真的取决于很多东西,但你可以从一个简单的冒泡排序开始,这可能接近你可能正在学习的东西。祝你好运。

http://www.geeksforgeeks.org/bubble-sort/

答案 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个的数组中。