2017-11-25 189 views
-4

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

第一步是确定您需要使用哪种编程语言编写代码。 – juanchopanza

+0

@juanchopanza没有要求我的入门课程有“C”和“C++”两个元素。我会很感激一个建议。 – Theta

+1

C++,'std :: string','std :: sort'。 – juanchopanza

回答

0

它看起来像我混淆了C和C++的方式,可能无法正常工作,尽管我不确定。如果你使用的是二维字符数组,那么它听起来像你应该使用较低级别的C范例。在这种情况下,我将停止使用cincout并切换到使用scanfprintf功能系列<stdio.h>。如果你应该使用strcmp那么这绝对听起来像你应该去的路线。

至于排序,如果您使用C,那么看看<stdlib.h>中的qsort函数,如果您允许使用它。

+0

你能告诉我如何用'scanf'将字符串输入到这样的数组中吗?我似乎遇到了问题。 – Theta

+0

问候,@Theta。我知道如何使用'scanf'将字符串输入到这样一个数组中,就像手册一样(作为一名C程序员,您应该阅读它,因此Michaels建议您阅读它),并且因为之前已经提出过这个问题(数百次,可能数千次),并且与这个问题无关,我认为你不会在这里找到任何人成为你的百科全书。在你的教育中发挥更积极和独立的作用。不要让别人代表你学习/解释。 – Sebivor

0

改为使用std::cin.getline(arr[i], 100);并检查字符串arr[i][0]的第一个字符为'\ 0'。所以,你的循环应该是这样的:

for (int i = 0; i < 40; i++) 
{ 
    std::cin.getline(arr[i], 100); 
    count++; 
    if (arr[i][0] == '\0') //working 
    { 
     break; 
    } 
} 
0

在学校的关键是学习,但你指出正确的方向...

Your loop 
for (int i = 0; i < 40; i++) 
{ 
    cin >> arr[i]; 

你的循环需要40个字符。返回角色不会被cin选为角色。您必须添加空格或其他字符。

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

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

0

...但我创建的指针数组的方式真的是最有效的?

不,它甚至不是正确。在C两者和C++编写的阵列

  • 是元素
  • 连续的,未分段的序列具有大小等于乘以每个维度的元素数

但是,由于在您的代码中多次致电malloc,因此这两个标准的都被打破:

  • 没有保证malloc将跨越多个呼叫分配要素的连续,不分段的序列
  • 你需要分配额外的字节在poi间接的第二级来表示指针(poi是40数组指针,每个指针可能指向数组40)。

在C语言中,如果你想要的东西,你可以大多使用像一个指针数组,你应该使用类似:

char (*poi)[40] = malloc(40 * sizeof *poi); 
// poi[39][39] = ... 

你也可以简化这个使用typedef

typedef char array_of_40_char[40]; 
array_of_40_char *poi = malloc(40 * sizeof *poi); 

在C++中,你通常会远离malloc,因为有很多更清洁的选择。为了您的用例,你很可能被鼓励使用类似:

std::vector<std::string &> *poi = new std::vector<std::string &>(); 

附:你有一个缓冲区溢出。您不应该尝试将100个字符读入只能存储40个数组的数组中。

相关问题