C语言:我尝试将2d字符串传递给函数并需要使用指针,但它显示警告

C Language: I try passing 2d string to function and need to use pointer, but it shows the warning

提问人:LunaticCoder 提问时间:11/30/2022 最后编辑:Vlad from MoscowLunaticCoder 更新时间:11/30/2022 访问量:64

问:

我是一名大学生。老师希望我传递多个字符串来发挥作用。答案输出是正确的,但我想知道警告是什么,为什么显示以及如何在我的情况下修复它。

我试图弄清楚,但我搜索了很多次。它只包含另一个案例,没有人像我这样的案例(使用带有指针的刺痛)。因此,如果您能另外向我推荐具有我的案例的网站或传递 2d 数组功能的东西,我将不胜感激。

代码如下

#include <stdio.h>
#include <string.h>


int hydroxide(char (*message)[100], int size);

int main()
{
    char message[6][100] = {"KOH", "H2O2", "NaCl", "NaOH", "C9H8O4", "MgOH"};
    int size;

    printf("Messages ending with OH are: ");

    for(int i = 0; i < 6; i++)
    {
        size = strlen(message[i]);

        if(hydroxide(message[i], size) == 1)
        {
            printf("%s ", message[i]);
        }
    }

    printf("\n");

    return 1;   
}

int hydroxide(char (*message)[100], int size)
{
   if(((*message)[size - 2] == 'O') && ((*message)[size - 1] == 'H'))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

当我尝试运行它时,它显示如下。

HW-4_5_3.c: In function 'main':
HW-4_5_3.c:19:22: warning: passing argument 1 of 'hydroxide' from incompatible pointer type [-Wincompatible-pointer-types]
         if(hydroxide(message[i], size) == 1)
                      ^~~~~~~
HW-4_5_3.c:6:5: note: expected 'char (*)[100]' but argument is of type 'char *'
 int hydroxide(char (*message)[100], int size);
     ^~~~~~~~~
Messages ending with OH are: KOH NaOH MgOH

“以 OH 结尾的消息是:KOH NaOH MgOH”的部分是我想要的。那么,我该如何解决呢?

多维数组 参数传递 C-字符串隐 式转换

评论


答:

0赞 Ted Lyngmo 11/30/2022 #1

如果你有

int hydroxide(char (*message)[100], int size);

您需要提供指向以下 A 的指针:char[100]

if(hydroxide(&message[i], size) == 1)
//           ^

如果您确实希望原始调用正常工作,则需要更改 。例:hydroxide

int hydroxide(char *message, int size)
{
   if(size < 2) return 0; // added precaution

   if((message[size - 2] == 'O') && (message[size - 1] == 'H'))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
4赞 Vlad from Moscow 11/30/2022 #2

第一个函数参数

int hydroxide(char (*message)[100], int size);

具有类型,但在函数的调用中char ( * )[100]

if(hydroxide(message[i], size) == 1)

对应参数的类型为 。也就是说,将类型用作参数表达式的数组隐式转换为指向其第一个元素的类型的指针char *message[i]char[100]char *

按以下方式声明和定义函数

int hydroxide( const char *message )
{
    size_t n = strlen( message );

    return n > 1 && message[n-2] == 'O' && message[n-1] == 'H';
}

并称它为

if ( hydroxide(message[i] ) )

请注意,该函数应该有一个参数:指向字符串的指针。该参数应具有限定符,因为该函数不会更改传递的字符串。第二个参数之所以令人困惑,是因为假设该函数处理字符串。所以它本身应该确定字符串的长度,并检查长度是否不小于 .const2

无需在函数的 if-else 语句中使用两个 return 语句。编写一个带有包含逻辑运算符的表达式的返回语句就足够了。在这种情况下,该函数将精确返回 or 。10

评论

0赞 LunaticCoder 11/30/2022
谢谢。我还想知道编译器是否知道 char *message 是 2d 数组?还是因为 char 类型而为人所知?起初,我以为它不知道我声明了 2d 参数,所以我决定使用 (*message)[100]。
0赞 Vlad from Moscow 11/30/2022
@LunaticCoder char *message 声明指向字符的指针。它是指向字符串 message[i] 的第一个字符的指针,作为参数表达式传递给函数。
0赞 LunaticCoder 11/30/2022
因此,无需将 2d 数组声明为 char 参数。我的理解正确吗?
0赞 Vlad from Moscow 11/30/2022
@LunaticCoder 该函数处理字符串。字符串存储为一维数组。
1赞 ChrisSc 11/30/2022 #3

您正在声明一个参数,该参数是大小为 100 的 char 指针数组。尝试将其更改为指针

int hydroxide(char *message, int size);

无需将以 null 结尾的字符串的大小声明为参数