微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中的2D字符串数组:

如何解决C中的2D字符串数组:

我很长时间以来第一次使用C语言,而对我来说最大的问题之一就是使用字符串,因为它们在Python中的表达方式不尽如人意。

据我了解和了解,char *只是一个指向字符串(或更确切地说,是字符串中的第一个字符)的指针。 char[]非常相似,可以用相同的方式使用。

我的第一个问题是一个附带的问题,但是当我们使用它执行相同的事情时,正确性或编译器如何看待它呢?

继续,我知道char *[]只是一个数组,但是每个元素都是char *类型的指针。因此,通过引用/访问每个元素时,它只会返回一个字符串。这就是char *argv[]仅从命令行获取值的原因。

对于我正在研究的问题,我需要一个二维数组的字符串,并一直试图运行它的是char *[][]并对其进行函数调用

我有一个定义为void runoff_function(candidates *,int a,int b,char * array[a][b]);函数类型,需要一个2D的字符指针数组。

我的主要功能一个变量,定义并填充为char* list[n][argc];

运行循环初始化用户输入时除外:

char* list[n][argc];
    for(int i=0;i<n;i++)
    {
        printf("Voter %d\n",(i+1));

        for(int j=1;j<argc;j++)
        {
            printf("Rank %d\t",j);
            scanf("%s",list[i][j-1]);
    }

第一次输入后出现段错误,不知道为什么。

解决方法

声明char* list[n][argc];仅为字符串指针保留空间。但是,每个字符串都需要一个位置来存储其字符。您必须提供此空间。

最简单,最安全的方法是指示scanf()在堆上为字符串分配一些空间。这可以通过向"m"转换中添加"%s"修饰符来完成。 scanf()随后将以char**作为参数,并将指针存储到该位置的新字符串。您的代码如下所示:

scanf("%ms",&list[i][j-1]);

请注意,随后摆脱内存分配是您的工作。因此,完成字符串处理后,您将需要添加一个循环,以在2D数组的每个单元格上调用free()

for(int i=0;i<n;i++) {
    for(int j=1;j<argc;j++) {
        free(list[i][j-1]);
    }
}

"%ms"格式由POSIX.1-2008标准指定,因此可以在任何现代linux上安全使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。