2011-03-10 133 views
0

在点亮手电筒之前,我试图自学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:warning:character常量太长其类型
  • /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:error :初始化参数1'std :: basic_string < _CharT,_Traits,_Alloc> :: basic_string(const _CharT *,const _Alloc &)[with _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:错误:初始化参数1'std :: basic_string < _CharT,_Traits,_Alloc> :: basic_string(const _CharT *,const _Alloc &)[with _CharT = char,_Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:error:invalid conversion from'int'to 'const char *'
  • /Users/Tyler/Desktop/sort/main.cpp:13:error:初始化参数1的'std :: basic_string < _CharT,_Traits,_Alloc> :: basic_string(const _CharT *,const _Alloc &)[with _CharT = char,_Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:error:'int' 'const char *'
  • /Users/Tyler/Desktop/sort/main。cpp:13:error:初始化参数1'std :: basic_string < _CharT,_Traits,_Alloc> :: basic_string(const _CharT *,const _Alloc &)[with _CharT = char,_Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:error:从'int'无效转换为'const char *'
  • /Users/Tyler/Desktop/sort/main .cpp:13:error:初始化参数1'std :: basic_string < _CharT,_Traits,_Alloc> :: basic_string(const _CharT *,const _Alloc &)[with _CharT = char,_Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:13:error:从'int'无效转换为'const char *'
  • /Users/Tyler/Desktop/sort/main.cpp:13:error:初始化参数1'std :: basic_string < _CharT,_Traits,_Alloc> :: basic_string(const _CharT *,const _Alloc &)[with _CharT = char,_Traits = std :: char_traits,_Alloc = std :: allocator]'
  • /Users/Tyler/Desktop/sort/main.cpp:14:error:从'std :: string *'转换为非-scalar type'std :: string'requested
  • /Users/Tyler/Desktop/sort/main.cpp:15:error:'string'was not declared in this scope
  • /Users/Tyler/Desktop/sort /main.cpp:15:错误:预计为';' before'firstInAZOrder'
  • /Users/Tyler/Desktop/sort/main.cpp:17:error:从'std :: string *'转换为非标量类型'std :: string'请求
  • /Users /Tyler/Desktop/sort/main.cpp:18:错误:'firstInAZOrder'未在此范围内声明
  • /Users/Tyler/Desktop/sort/main.cpp:20:错误:从'std ::字符串*'到非标量类型'std :: string'请求
  • /Users/Tyler/Desktop/sort/main.cpp:26:错误:'sortedItems'未在此范围内声明
  • /Users/Tyler/Desktop/sort/main.cpp:29:error:'sortedItems'未在此范围内声明
  • /Users/Tyler/Desktop/sort/stringarray.cpp:10:error:'string'不是'std'的成员
  • /Users/Tyler/Desktop/sort/stringarray.cpp:10:error:预期','或';'之前,“{”令牌

回答

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*

+0

谢谢。我没有意识到引号是重要的。 – 2011-03-10 20:50:00

4

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

"bob" 

单引号字符常量。

然后,

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

应采取数组作为输入,但即使如此,将无法工作,不能由使其成为一个宏(这是为了让你从禁止一种肯定的方式来固定,除了C++专家协会十年)或者通过模板函数来实现,这可能有点高级。相反,使用std::vector,它有一个size方法。

最后,

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

并没有真正采取int,不是吗?循环中的停止条件也是很好的,以防止谚语龙飞出你的鼻子。

+0

帮助了很多。:) – 2011-03-10 20:51:35

+1

找到一个数组的大小很简单:'template int length(const T(&)[N]){return N;}' – 2011-03-10 20:54:36

+0

它更容易找到'std :: string'的长度:'s.length()'。 – 2011-03-10 21:00:17

0

只是修复一次错误一个 -

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

第二个 - 尝试INT * sortedItems

只需要一次一个地修改它们,编译完成后,调试器将成为你的朋友

+0

谢谢。这减少了一半的错误。 – 2011-03-10 20:49:17