C++,函数中的字符串总是有相同的长度

C++ , string in a function has always the same length

本文关键字:函数 字符串 C++      更新时间:2023-10-16

这段代码有什么问题?在我的函数测试中,输入的长度总是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);
}
数组在

传递给函数时衰减到指针

sizeof(arr)会给你char*的大小

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

如果确实必须使用原始指针,请将长度作为附加参数传入:

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

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

另请查看此问题以获取更多详细信息。