在一个二维字符串数组中查找字符串的数量。

8

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

我参考了这个方法。

但是如果我将其传递到函数中,它就无法正常工作。

以下是我尝试过的代码:

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

你知道你需要解决这个问题的编译器是哪一个吗? - MikeMB
2个回答

8

sizeof(char*)会返回char*指针的大小(在您的系统上为4)。

sizeof(str2)返回数组str2的大小。这里有8个元素,每个元素都是指针类型。因此,在您的系统上,总大小为8乘以4等于32。

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

在C++中,考虑使用std::vector<std::string>>作为替代方案。


这个函数还是不行,strlen(*input1)的输出结果仍然是4。 - prashantitis
2
@Guru 这是因为 input1 不是一个数组,而是一个 char**。请阅读 如何在 C++ 中使用数组,特别是关于数组到指针转换的部分。 - jrok
@jrok:那么我应该怎么做才能在函数中得到输出8呢? - prashantitis
@Guru 你需要将大小作为参数传递给函数。请查看我之前评论中的链接。 - jrok
@jrok:实际上这是一个在线竞赛问题,我需要这个功能。而且我不能修改给定的函数原型。难道没有其他方法可以不修改f1的原型吗? - prashantitis
1
@Guru 如果你不能改变原型,那么要么你有一个哨兵值来标记数组的结尾,要么这个问题是无法解决的。 - Quentin

1
如果你只有一个数组指针,你就无法知道数组的长度。因为你只能拥有一个指针,所以不能通过值传递数组。传递给函数的数组会自动转换成指针,并且参数类型 char * foo [] 等同于 char ** foo size_of 也没有用,因为它只会告诉指针本身的大小。
将长度作为参数传递给 f1。或者更好的选择是使用 std::vectorstd::array

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

那很不幸。那么你必须采取一些技巧。最简单的解决方法是将长度存储在全局变量中,而不是函数参数中。
另一个可能性是终止值。例如,始终用 nullptr 结束数组,不允许其他元素具有该值。与 c-字符串以 null 字符结尾的方式相同。然后当遇到 nullptr 时可以停止迭代数组。但我假设你也不能修改数组。

我非常了解这个,但实际上这是一个在线竞赛问题,我需要这个功能。但是我不能修改给定的函数原型,难道没有其他方法可以不修改f1的原型吗? - prashantitis
@Guru 如果你非常了解,那么为什么还要问 size_of 为什么不起作用呢?无论如何,你可以使用全局变量代替参数。 - eerorika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接