C ++,函数中的字符串始终具有相同的长度

时间:2015-01-21 22:21:25

标签: c++

这段代码有什么问题?无论我的字符串实际上是更长还是更短,输入在我的函数测试中总是长度为4。

#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);
}

3 个答案:

答案 0 :(得分:5)

在传递给函数

时,数组衰减到指针

sizeof(arr)会为您提供char*

的大小

答案 1 :(得分:3)

不要使用数组;而是更喜欢std::vector。当你认为你将一个数组传递给一个函数时,你实际上是在传递一个指针,而你的架构指针是4个字节宽。 char arr[]是一种在函数参数中拼写char* arr的奇怪方法。这被称为“指针衰减”。

如果你真的必须使用原始指针,请将长度作为附加参数传递:

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

test(input.length(), arr);

答案 2 :(得分:0)

在函数中执行sizeof(arr)时,您将获取指针的大小。将数组传递给类似于函数的函数是一个语法糖,实际上它传递一个指向数组的指针,你只需要指针的大小(在你正在使用的机器上恰好是4字节)。您需要将数组的大小传递给另一个参数中的函数或使用方便的STL容器。

另请查看this question了解详情。