【问题标题】:find the number of strings in 2D array of strings查找二维字符串数组中的字符串数
【发布时间】:2015-04-17 09:10:25
【问题描述】:

给定一个字符串数组,我需要找出其中的字符串数。

我关注了this

但如果我将它传递给函数,这将不起作用。

这是我尝试过的代码

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

int f1(char* input1[])
{

    string s="";

    cout<<sizeof(input1)<<endl; //print 4
    cout<<sizeof(char*)<<endl;  //print 4
    int l=sizeof(input1) / sizeof(char*);
    //giving l=1 here but should be 8
}

int main()
{
    char *str2[]={"baba","sf","dfvf","fbfebgergrg","afvdfvfv","we","kkhhff","L"};
    int l=sizeof(str2) / sizeof(char*);
    cout<<l<<endl; //print 8
    cout<<sizeof(str2)<<endl; //print 32
    cout<<sizeof(char*)<<endl; //print 4
    f1(str2);
}

【问题讨论】:

  • 你知道你必须为哪个编译器解决这个问题吗?

标签: c++ arrays string


【解决方案1】:

sizeof(char*) 为您提供char* 指针的大小(在您的系统上为 4)。

sizeof(str2) 为您提供数组str2 的大小。有 8 个元素,每个元素都是一个指针类型。所以你系统的总大小是 8 x 4 = 32。

要获取字符串的长度,请使用strlen

请考虑将 std::vector&lt;std::string&gt;&gt; 作为 C++ 中的替代方案。

【讨论】:

  • 这不起作用 strlen(*input1) 再次在函数中给出 4 作为输出。
  • @Guru 那是因为input1 不是一个数组。这是char**。请阅读How to use arrays in C++,尤其是数组到指针的转换部分。
  • @jrok: 那我应该怎么做才能得到函数中的输出 8??
  • @Guru 您需要将大小作为参数传递给函数。检查我之前评论中的链接。
  • @Guru 如果不允许你更改原型,那么要么你有一个哨兵值来标记数组的结尾,要么这个问题无法解决。
【解决方案2】:

如果你只有一个指向数组的指针,你就无法知道数组的长度。而且您确实只有一个指针,因为您不能按值传递数组。传递给函数的数组将自动衰减为指针,参数类型char* foo[] 等价于char** foosize_of 没有帮助,因为它只会告诉指针本身的大小。

将长度作为参数传递给f1。或者更好的是,使用std::vectorstd::array

我无法修改给定的函数原型

嗯,这很不幸。然后你必须诉诸一些诡计。最简单的解决方法是将长度存储在全局变量而不是函数参数中。

另一种可能性是终止值例如,始终以 nullptr 结束数组,并且永远不允许其他元素具有该值。与 c 字符串以空字符终止的方式相同。然后你可以在遇到 nullptr 时停止迭代数组。但我假设你也不能修改数组。

【讨论】:

  • 我非常了解,但实际上这是一个在线竞赛问题,我需要此功能。我无法修改给定的函数原型。难道没有其他方法我不需要修改f1的原型
  • @Guru 如果您对此非常了解,那您为什么要问为什么size_of 不起作用?无论如何,您可以求助于全局而不是参数。
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2019-09-14
相关资源
最近更新 更多