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

Posted

技术标签:

【中文标题】在 C 中,如何修复此警告:格式“%s”需要“char *”类型的参数,但参数 3 的类型为“char (*)[100]【英文标题】:In C, how to fix this warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[100] 【发布时间】:2022-01-13 19:46:34 【问题描述】:

如何修复警告?

警告:从不兼容的指针类型“char *”分配给“struct people *”

格式“%s”需要“char ”类型的参数,但参数 3 的类型为“char ()[100]

/* loading user information from the file*/
    void load_file(struct people *head)
    
    FILE *pFile;
    char line[N];
    char temp_name[100];
    char temp_username[100];
    char temp_birthPlace[100];
    char new_people[100];
    char temp_the_date_of_birth[100];
    //open the FILE
    if (pFile = fopen("facebook", "r"))
    
            // reading the contents of the file line by line
            while (fgets(line, N, pFile) != NULL)
        
            struct people *new_people = (struct people *)malloc(sizeof(struct people));
            //Temporarily saving variables read from file
            sscanf(line, "%s,%s,%s,%s",&temp_name,&temp_username,&temp_the_date_of_birth,&temp_birthPlace);
            strcpy(new_people->name, temp_name) == 0;
            strcpy(new_people->username, temp_username) == 0;
            strcpy(new_people->the_date_of_birth, temp_the_date_of_birth) == 0;
            strcpy( new_people->birthPlace, temp_birthPlace) == 0;
                // adding new people and then putting them as head at the beginning of the linked list
            new_people->next = head;
            head = new_people;
        
        fclose(pFile);
        printf("file exists");
    
    else
    
        printf("file does not exist");
    
    return;


//sort out users and list up their personal information along with the date of birth and birthplace
void invite_group(struct people *head)

    FILE *pFile;
    char temp_username[100];
    char temp_birthplace[100];
    char temp_the_date_of_birth[100];
    struct people *ptr;
    struct people *temp_head = malloc(sizeof(temp_head));
    *temp_head = *ptr;

    This ArrayList also allows users to add and sort items in the list.
    struct people *ListArray[100];
    int count = 0;
    printf("please input username who invites you\n");
    scanf("%s", ptr->username);
     while ((ptr->next) != NULL)
     
        if(temp_username == ptr->username)
          
            pFile = fopen("test.txt", "r");
          
            if (pFile != NULL)
            
                //input username, the date of birth and birthplace into the file
                fprintf(pFile, "username %s,the_date_of_birth %s,birthPlace %s", ptr->username, ptr->the_date_of_birth, ptr->birthPlace);
                // list and display username, the date of birth and birthplace
                ListArray[count++] = ("%s", "%s", "%s", ptr->username,ptr->the_date_of_birth, ptr->birthPlace);
            
            ptr = ptr->next;
    
    return;
  

【问题讨论】:

这可能意味着您在调用 scanf%s 时错误地使用了 & 以及您想要将字符串读入的 char 数组。 scanf 在各方面都很奇怪,其中之一就是你总是需要使用&except%s 编译器错误也是如此。它们是文本。您可以将其作为文本直接添加到您的问题中。 您可能想阅读以下内容:Why not upload images of code/errors when asking a question? @SteveSummit ... 和 except%[...]. 【参考方案1】:

转换说明符%s 需要char * 类型的参数。

例如,如果您有这样的字符数组

char temp_name[100];

然后在表达式中使用它被转换为char *类型的指针指向它的第一个元素。

所以你可以写

sscanf(line, "%s", temp_name );

另一方面,表达式&temp_name 的类型为char ( * )[100]。也就是说,它是指向整个对象的数组的指针。所以这个表达式可能不会在上面的sscanf调用中使用,因为它没有char *的类型..

还要注意函数无论如何都是不正确的。

void load_file(struct people *head)

它处理传递给它的指针值的副本。更改函数内的副本不会影响用作函数参数的原始指针的值。所以在执行函数后,原始指针保持不变。您需要通过引用将其传递给函数。那就是函数应该声明为

void load_file(struct people **head);

在函数内你必须写

        new_people->next = *head;
        *head = new_people;

如果在函数调用者中有指针

struct people *head;

然后调用函数就像

load_file( &head );

【讨论】:

这是非常有用的。警告刚刚被清除。我也想知道你是否可以帮助我解决这个警告? 184 | ListArray[count++] = ("%s", "%s", "%s", ptr->username,ptr->the_date_of_birth, ptr->birthPlace); @Taja 带有警告的语句是不正确的。在赋值的右侧,使用了带有逗号运算符的表达式。它的值是最后一个操作数的值。但是分配给的对象不具有类型 char *. 感谢您的评论!嗯,您能否详细说明或给我一些示例,让我了解如何修复警告? @Taja:comma operator 所做的事情与您想要完成的事情完全不同。我的猜测是你需要写类似sprintf( ListArray[count++], "%s %s %s", ptr->username,ptr->the_date_of_birth, ptr->birthPlace); 的东西。

以上是关于在 C 中,如何修复此警告:格式“%s”需要“char *”类型的参数,但参数 3 的类型为“char (*)[100]的主要内容,如果未能解决你的问题,请参考以下文章

如何修复browser / IERC20.sol:4:53:警告:此声明会影响现有声明

我该如何修复此警告信息。警告:忽略“UIButton”实例上的键路径“radius”的用户定义的运行时属性

如何修复 Magento 1.7 开发者模式

如何修复未受保护的 SMS BroadcastReceiver lint 警告

如何修复 PHP 警告:file_exists():文件名超过此平台上允许的最大路径长度 (260)?

如何修复“预计在箭头函数末尾返回一个值”警告?