C: 格式“%s”需要“char*”类型的参数,但参数 2 的类型为“char**”

Posted

技术标签:

【中文标题】C: 格式“%s”需要“char*”类型的参数,但参数 2 的类型为“char**”【英文标题】:C: format '%s' expects argument of type 'char*', but argument 2 has type 'char**' 【发布时间】:2015-05-19 18:06:25 【问题描述】:

我尝试输入简单的二维字符串数组,从用户那里获取字符串并打印出来

void in(char* n[3][2]);
void show_name ()

    char* n[3][2];
    in(n);
    unsigned int i,j;
    for(i=0;i<3;i++)
    
        for(j=0;j<2;j++)
            printf("%s ", &n[i][j]);
        printf("\n");
    


int main(void)

    show_name();
    return 0;

void in(char* n[3][2])


   int i,j;
    for(i=0;i<3;i++)
        for(j=0;j<2;j++)
            scanf("%s",&n[i][j]);

    printf("\n");

它工作正常,但我有警告说:

警告:格式“%s”需要“char*”类型的参数,但参数 2 类型为 'char**' [-Wformat]|

我搜索了我发现%s 中的问题不需要地址的原因 当我删除 &amp; 运算符时没有警告但代码运行不正确

【问题讨论】:

我认为警告信息应该很明显。 show_name()中不需要char *n[3][3],使用void in(char **n),调用为in(n); 这里有很多错误: * 你没有检查输入的大小,这使得缓冲区溢出成为可能 * 你很可能想要扫描 3 个字符串,但调用 scanf 6 次。 至于它不能正常工作,可能是因为你是一个指针数组数组,而你从来没有初始化指针,所以用例如写入它们。 scanf 将导致未定义的行为。这不是scanf 调用的实际 问题,就像现在一样。 是的,正如@mat69 所说,您只需要运行循环 3 次 【参考方案1】:

我已简化并更正了您的程序,并评论了我更改的地方。

EDIT如何方便地改变字符串的数量,现在6个如上cmets

#include <stdio.h>

#define STRINGS 6

void in(char n[][200]);         // no need for * and array

void show_name ()

    char n[STRINGS][200] = ;  // allow some string space and init for security
    int i;
    in(n);
    for(i=0; i<STRINGS; i++)    // only need to iterate one dimension
        printf("%s\n", n[i]);


int main(void)

    show_name();
    return 0;


void in(char n[][200])          // needs length of each row, but not number of rows

    int i;
    for(i=0; i<STRINGS; i++)    // only need to iterate one dimension
        scanf("%199s", n[i]);   // restrict the input length
    printf("\n");

【讨论】:

现在它和一维数组有什么区别?? 编辑您的代码并删除 '&' 运算符,因为它仍然会产生相同的交战 这是一个好点。我的编译器没有在那里给出警告,我知道即使它是严格不正确的也要正确处理。 这是一个char 的二维数组,但每个“字符串”都是一个一维char 数组。当您作为字符串进行迭代时,这实际上也是一维的。 n[i] 被编译器转换为 char* 我现在真的误解了 c 中的二维数组 :) 当我在 c#、Java 和 python 中实现它时,它看起来像数学中真正的需要 2 个循环,一个用于行,一个用于列跨度>

以上是关于C: 格式“%s”需要“char*”类型的参数,但参数 2 的类型为“char**”的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中,如何修复此警告:格式“%s”需要“char *”类型的参数,但参数 3 的类型为“char (*)[100]

%c对应类型为char, %s对应类型为char *

%c对应类型为char, %s对应类型为char *

C 语言:收到错误:警告:格式“%d”需要“int *”类型的参数,但参数 2 的类型为“int **”[-Wformat=]

格式“%d”需要“int”类型的参数,但参数 2 的类型为“int *”

一个char阵列 放入一堆数字,输出用啥?%s,还是%d , 还是%c?