2013-02-17 5 views
4

Я пытался найти длину string, которая имеет массив char с функцией strlen(), но она не работает. код я использую что-то вроде этого:Найти длину массива строк с помощью strlen()

string s[]={"a","b","c"}; 
int len = strlen(s.c_str()); 

Он производит следующее сообщение об ошибке:

"request for member âc_strâ in âwArrayâ, which is of non-class type" 

Но когда я использовал эту strlen() функцию string с до, как это, он работал отлично:

fin.open("input.txt"); 
string tempStr; 
getline(fin, tempStr,'\n'); 
int len = strlen(tempStr.c_str()); 

Что мне здесь недостает? Я знаю, что могу найти длину string s[] с

int size = sizeof(s)/sizeof(s[ 0 ]); 

Но почему я не могу использовать strlen(). Может кто-нибудь объяснить, что происходит?

+3

'' 'массив ', он не имеет функции' c_str'. std :: vector вариант? – billz

+0

Вам не хватает того, что 'std :: string' не' std :: string [] '. –

+0

@Billz Но он работает для массива типа char .... ???????????/ – DeadCoder

ответ

8

найти длину массива фиксированного размера любого типа достаточно легко с помощью шаблона вспомогательной функции:

#include <cstddef> // for std::size_t 

template< class T, size_t N > 
std::size_t length(const T (&)[N]) 
{ 
    return N; 
}; 

string s[]={"a","b","c"}; 
std::cout << length(s) << std::endl; 

В C++ 11, функция будет constexpr.

Относительно strlen, он насчитывает chars, пока не найдет нулевой символ окончания \0. Когда вы вызываете метод c_str(), вы получаете указатель на первый char в нулевой завершаемой строке.

способ
+0

Это должно возвращать size_t; отличный ответ! –

+0

@juanchopanza Спасибо .. Но мне действительно нужно знать, почему strlen() работает с tempStr, а не с строкой s. (см. код для tempStr и s) – DeadCoder

+0

@AlexChamberlain Я не помню с головы, заголовок которого требуется для 'std :: size_t'. Исправлено. – juanchopanza

0

он должен быть как:

string s[]={"a","b","c"}; //array of string 
for(auto i:s){ 
int len = strlen(i.c_str()); because you need to convert one string to c type string 
cout<<len<<" "; 
} 

, чтобы получить длину массива:

std::array<int> nums {1, 3, 5, 7}; 

std::cout << "nums contains " << nums.size() << " elements.\n"; 

http://en.cppreference.com/w/cpp/container/array/size

strlen() принимает ctype строки. и c_str() конвертировать string (STL) в ctype строка (Null terminated), которая принимается strlen.

+0

Не давая правильная длина. Длина достигает 1. – DeadCoder

+0

что это дает.? – Arpit

+0

@Arpit, конечно, это 1, каждый элемент массива имеет длину 1. – juanchopanza

1

C++, чтобы сделать это было бы использовать STD :: Вектор

vector<string> ss; 

ss.push_back("a"); 
ss.push_back("b"); 
ss.push_back("c"); 

cout << ss.size(); // number of strings in your vector : 3 

вы также можете получить доступ к каждой строке:

cout << ss[0].size(); // 1 
0

Определить из STRLEN: size_t STRLEN (Const символ * ул), обратите внимание на тип входного параметра. вы определяете строку s [] = {"a", "b", "c"}; который является массивом , поэтому следующий оператор будет работать: strlen (s [0] .c_str()); Кроме того, для вычисления длины массив s, sizeof (s)/sizeof (s [0]) работают только тогда, когда каждый элемент 's' имеет одинаковую длину.

Смежные вопросы