【问题标题】:Passing 2D array and vector of string as argument to function将二维数组和字符串向量作为参数传递给函数
【发布时间】:2015-11-01 14:49:16
【问题描述】:

我编写了两个函数,其中我将字符串向量传递给特定函数(PrintStringVector)只是为了打印内容,在第二个函数中,传递指针数组以打印内容。第一个函数工作正常,但第二个一个是给出低于我的代码的错误。

#include <cmath>
#include <stdlib.h>
#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int n;

void PrintStringVector(vector<string> & v){


    for(int i=0;i<v.size();i++){ cout<<v[i]<<endl;}

}


void PrintStringArray(const char *arr[n]){

    for(int i=0;i<n;i++){ cout<<arr[i]<<endl;}



}

int main() {

    vector<string>  vec;                    
    cin>>n;
    const char *arr[n];

    for(int i=0;i<n;i++){
        string str;
        cin>>str; 
        vec.push_back(str);
        arr[i]=str.c_str();
    }

    PrintStringVector(vec);
    PrintStringArray(arr);


    return 0;
}

错误:

        vinod@vinod-Inspiron-3537:~/Documents/hackerrank$ g++       passing_vector_of_string_or_passing_2d_array.cpp 
        passing_vector_of_string_or_passing_2d_array.cpp:17:35: error: expected ‘,’ or ‘...’ before ‘arr’
        void PrintStringArray(const char* arr[n]){
                                           ^
        passing_vector_of_string_or_passing_2d_array.cpp: In function ‘void PrintStringArray(const char*)’:
        passing_vector_of_string_or_passing_2d_array.cpp:19:33: error: ‘arr’ was not declared in this scope
        for(int i=0;i<n;i++){ cout<<arr[i]<<endl;}
                                         ^
        passing_vector_of_string_or_passing_2d_array.cpp: In function ‘int main()’:
        passing_vector_of_string_or_passing_2d_array.cpp:40:25: error: cannot convert ‘const char**’ to ‘const char*’ for argument ‘1’ to ‘void PrintStringArray(const char*)’
        PrintStringArray(arr);

【问题讨论】:

  • 您的代码的另一个问题是,当您执行arr[i] = str.c_str(); 时,您存储的内存地址由超出范围str 的局部变量管理,这将导致未定义的行为。跨度>
  • 由于我没有更好的解决方案将字符串 str 分配给字符指针。我认为 c_str() 将 c++ 字符串转换为 c 字符串(由 char 数组组成)。
  • c_str() 返回一个与 C 兼容的指针,但该指针仅在返回它的 std::string 对象存在时才有效。您在此之后使用它。

标签: c++ arrays arguments


【解决方案1】:
const char *arr[n]

这不是一个有效的声明(除非n 是一个常量表达式)。 C++ 没有可变长度数组。

“但它在main内部对我有用!'

那是因为 g++ 实现了对 C++ 的扩展。此扩展似乎与 C 可变长度数组不兼容,并且通常有问题。不要使用它。

“但是我怎样才能拥有类似的功能呢?”

使用std::vector。不要使用指针,new[]delete[],除非您非常清楚为什么需要这些低级原语。

【讨论】:

    【解决方案2】:

    在 C++ 中,您不能使用 VLA(可变长度数组)。由于数组arr 的大小仅在运行时已知,因此您不能将其用作固定大小数组的大小。您应该使用new 来分配它。例如

    const char **arr = new const char*[n];
    

    也像这样修改函数签名

    void PrintStringArray(const char *arr[]){
    

    或者像这样

    void PrintStringArray(const char **arr){
    

    最后记得在完成后删除arr

    delete[] arr;
    

    【讨论】:

    • 没有。你不应该使用new 来分配数组。 (您可以,但不应该)。你应该使用std::vector
    猜你喜欢
    • 2015-05-27
    • 2012-01-22
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多