按字母顺序排序字符串数组的问题

时间:2011-03-10 20:32:32

标签: c++ debugging

在点燃火把之前,我正在尝试自学C ++。我觉得我已经很好地掌握了它,但如果你知道我的意思,我必须深入到底。我正在尝试调试一个我想要自学的简单程序。该程序的目标是按字母顺序对打印出的每个字符串数组进行排序。在将数组传递给我的length()函数时,我可能应该在这里使用指针,但我还没有那么远。有很多错误,我不确定错误实际上在哪里。请告诉我这是一个缺少分号的东西。我很确定if(itemsToSort [j]< firstInAZOrder)行不起作用,但我又想学习语言,我必须从某个地方开始。

main.cpp中:

#include <iostream>
#include "stringarray.h"

void output (int sortedItems) {
    for (int i = 0; ; i++) {
        std::cout << sortedItems[i] << std::endl;
    }
}

int main (int argc, char * const argv[]) {
    std::string itemsToSort[] = {
        'bob', 'john', 'tyler', 'anthony', 'luke', 'eric'
    };
    std::string sortedItems[length(itemsToSort)];
    string firstInAZOrder;

    for (int i = 0; i < length(itemsToSort); i++) {
        firstInAZOrder = itemsToSort[i];

        for (int j = i + 1; j < length(itemsToSort); j++) {
            if (itemsToSort[j] < firstInAZOrder) {
                firstInAZOrder = itemsToSort[j];
            }
        }

        sortedItems[i] = firstInAZOrder;
    }

    output(sortedItems);
    return 0;
}

stringarray.cpp:

int length (std::string array) {
    return sizeof(array) / sizeof(array[0]);
}

stringarray.h:

int length (std::string array);

以下是Xcode给我的错误和警告列表:

  • /Users/Tyler/Desktop/sort/main.cpp:12:3:警告:多字符字符常量 -
  • /Users/Tyler/Desktop/sort/main.cpp:12:18:警告:字符常量对于其类型来说太长
  • /Users/Tyler/Desktop/sort/main.cpp:12:27:警告:字符常量对于其类型而言太长
  • /Users/Tyler/Desktop/sort/main.cpp:在函数'void output(int)'中:
  • /Users/Tyler/Desktop/sort/main.cpp:6:错误:数组下标的无效类型'int [int]'
  • /Users/Tyler/Desktop/sort/main.cpp:在函数'int main(int,char * const *)'中:
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:从'int'无效转换为'const char *'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:初始化'std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: basic_string(const _CharT *,const _Alloc&amp;)的参数1 [与_CharT = char,_ Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:从'int'无效转换为'const char *'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:初始化'std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: basic_string(const _CharT *,const _Alloc&amp;)的参数1 [与_CharT = char,_ Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:从'int'无效转换为'const char *'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:初始化'std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: basic_string(const _CharT *,const _Alloc&amp;)的参数1 [与_CharT = char,_ Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:从'int'无效转换为'const char *'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:初始化'std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: basic_string(const _CharT *,const _Alloc&amp;)的参数1 [与_CharT = char,_ Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:从'int'无效转换为'const char *'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:初始化'std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: basic_string(const _CharT *,const _Alloc&amp;)的参数1 [与_CharT = char,_ Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:从'int'无效转换为'const char *'
  • /Users/Tyler/Desktop/sort/main.cpp:13:错误:初始化'std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: basic_string(const _CharT *,const _Alloc&amp;)的参数1 [与_CharT = char,_ Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:14:错误:从'std :: string *'转换为非标量类型'std :: string'请求
  • /Users/Tyler/Desktop/sort/main.cpp:15:错误:未在此范围内声明'string'
  • /Users/Tyler/Desktop/sort/main.cpp:15:错误:预期`;'在'firstInAZOrder'之前
  • /Users/Tyler/Desktop/sort/main.cpp:17:错误:从'std :: string *'转换为非标量类型'std :: string'请求
  • /Users/Tyler/Desktop/sort/main.cpp:18:错误:'firstInAZOrder'未在此范围内声明
  • /Users/Tyler/Desktop/sort/main.cpp:20:错误:从'std :: string *'转换为非标量类型'std :: string'请求
  • /Users/Tyler/Desktop/sort/main.cpp:26:错误:'sortedItems'未在此范围内声明
  • /Users/Tyler/Desktop/sort/main.cpp:29:错误:'sortedItems'未在此范围内声明
  • /Users/Tyler/Desktop/sort/stringarray.cpp:10:错误:'string'不是'std'的成员
  • /Users/Tyler/Desktop/sort/stringarray.cpp:10:错误:预期','或';'在'{'token
  • 之前

3 个答案:

答案 0 :(得分:4)

字符串常量应为双引号,而不是单引号:

"bob"

单引号用于字符常量。

然后,

int length (std::string array) {
    return sizeof(array) / sizeof(array[0]);
}

应该以数组作为输入,但即使这样也无法工作,除非将其设为宏(这是让你被C ++专家公会禁止十年的可靠方法)或者无法修复通过使length成为模板函数,这可能有点先进。请改用std::vector,它有size方法。

最后,

void output (int sortedItems) {
    for (int i = 0; ; i++) {
        std::cout << sortedItems[i] << std::endl;
    }
}

并不真正采用int,是吗?循环中的停止条件也会很好,以防止众所周知的龙飞出你的鼻子。

答案 1 :(得分:3)

首先:

std::string itemsToSort[] = {
    'bob', 'john', 'tyler', 'anthony', 'luke', 'eric'
};

引号字符(')只能用于单个字符。 为此使用双引号(“):

std::string itemsToSort[] = {
    "bob", "john", "tyler", "anthony", "luke", "eric"
};

下一步:

void output (int sortedItems) {
    for (int i = 0; ; i++) {
        std::cout << sortedItems[i] << std::endl;
    }
}

这个函数只需一个整数,而这根本不是你想要的。假设您想学习如何使用指针,您可以尝试类似:

void output (int* intArray, int arraySize) {
    for (int i = 0; i < arraySize; ++i) {
        std::cout << intArray[i] << std::endl;
    }
}

此函数获取指向内存中某些整数的指针,以及那里的数字。这解决了下一个问题,即知道你的for循环应该何时终止。

在实际代码中,您可以使用std::vector之类的内容代替int*

答案 2 :(得分:0)

一次只修复一个错误 -

第一个是因为你需要双引号(“)而不是单引号(')

第二个 - 尝试int * sortedItems

只要一次一个地重复它们,编译完成后,调试器就会成为你的朋友