2015-01-21 2 views
0

Что не так с этим кодом? вход всегда имеет длину 4 в моем функциональном тесте, независимо от того, действительно ли моя строка больше или короче.C++, строка в функции всегда имеет одинаковую длину

#include <iostream> 
#include <string> 
using namespace std; 

void test(char arr[]){ 
    string input; 

    input = arr[0]; 
    for (int i=1; i<sizeof(arr)/sizeof(char); i++){input=input+arr[i];} 

    cout << input << endl; 
    cout << "length: " << input.length() << endl; 
} 


int main(){ 
    string input; 
    cout << "String: " << endl; 
    getline(cin, input); 
    char arr[input.length()]; 
    for(int i=0; i<input.length(); i++) {arr[i] = input[i];} 

    test(arr); 
} 
+0

Почему нижний предел? – Christian

+0

вход = вход + arr [i]; не уверен, можете ли вы это сделать. Вы можете конкатенировать строки, но не массивы символов – Nick

+0

char arr [input.length()]; ? Код не будет компилироваться в этой строке. – Matt

ответ

5

Массивы распадается на указатели при переходе функционировать

sizeof(arr) даст вам размер char*

3

Не использовать массивы; вместо этого предпочитают std::vector. Когда вы думаете, что передаете массив функции, вы фактически передаете указатель, а указатели на вашу архитектуру - 4 байта. char arr[] - это странный способ написания char* arr в функциональных параметрах. Это называется «распад указателя».

Если вы действительно должны использовать сырые указатели, проходят в длину в качестве дополнительного параметра:

void test(size_t length, char* arr) { 
    ... 
} 

test(input.length(), arr); 
0

Вы принимаете размер указателя, когда вы делаете sizeof(arr) в функции. Передача массива в функцию, подобную тому, что вы делали, - это синтаксический сахар, эффективно передает указатель на массив, и вы просто берете размер указателя (который на вашем компьютере используется 4 байта). Вам нужно передать размер массива функции в другой параметр или использовать удобный контейнер STL.

Также посмотрите на this question для получения более подробной информации.

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