以下 C 代码显示:格式 '%s' 需要类型为 'char *' 的参数,但参数 3 的类型为 int

Posted

技术标签:

【中文标题】以下 C 代码显示:格式 \'%s\' 需要类型为 \'char *\' 的参数,但参数 3 的类型为 int【英文标题】:The following C code shows that : format '%s' expects argument of type 'char *', but argument 3 has type int以下 C 代码显示:格式 '%s' 需要类型为 'char *' 的参数,但参数 3 的类型为 int 【发布时间】:2020-10-18 20:29:54 【问题描述】:

以下代码显示格式“%s”需要“char *”类型的参数,但第 139 行的类型为“int”。我没有看到变量类型有任何错误。这个问题出现在 scanf 中。除了这个问题,还有 3 个相关的问题。我一直在尝试并遇到同样的错误。请问有人可以帮忙吗?

这是结构:

struct employee
    
            char name[50];
            char sex;
            char adrs[50];
            char dsgn[25];
            int age,empID;
            float slry;
    ;

这是完整的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <stdbool.h>
#include <windows.h>
#include "struct.h"

void insert();
void list();
void edit();
void del();
void ext();

FILE * fptr, *ftemp;
struct employee e;
long int recsize;
char empname[50];



int main()

    //FILE * fptr, *ft;
    int choice;
    //fptr = fopen("ems.txt","rb+");

    fptr = fopen("ems.txt", "r+");


    if (fptr == NULL)
    
        printf("Can't find file! Attempting to create file... \n");

        fptr = fopen("ems.txt","w+");
        if(fptr == NULL)
        
            printf("Can't create file. Exiting...");
         ext(1);
        
    

    //Explain the reason for this?
    //recsize = (long int) sizeof(e);//


    while(1)
    
        printf("*******************************\n");
        printf("\nEmployee management system");
        printf("\n1. Insert employee information");
        printf("\n2. List all employee information");
        printf("\n3. Edit employee information");
        printf("\n4. Delete employee information");
        printf("\n5. Exit");
        printf("\n\n*****************************\n");
        printf("\n\n Enter your choice: ");
        scanf("%d", &choice);
        fflush(stdin);

        switch(choice)
        
            case 1:
                puts("Insert was chosen");
                insert();

                break;
            case 2:
                puts("List was chosen");
                list();
                break;
            case 3:
                puts("Edit was chosen");
                edit();
                break;
            case 4:
                puts("Delete was chosen");
                del();
                break;
            case 5:
                puts("Exit was chosen");
                ext(1);
                break;
            default:
                puts("Choice is incorrect!!");
                continue;
        
    

    return 0;



void insert()

    char next;

    do
    
        printf("********************************************************** \n");
        printf("\nEnter the name of the employee: ");
        gets(e.name);
        printf("\nEnter the sex of the employee (M/m or F/f): ");
        gets(&e.sex);
        printf("\nEnter the address of the employee: ");
        gets(e.adrs);
        printf("\nEnter designation of the employee: ");
        gets(e.dsgn);
        printf("\nEnter age of the employee: ");
        scanf("%d", &e.age);
        printf("\nEnter basic salary of the employee: ");
        scanf("%f", &e.slry);
        printf("\nEnter the employee's ID: ");
        scanf("%d", &e.empID);
        fputs(e.name, fptr);
        fputs(&e.sex, fptr);
        fputs(e.adrs, fptr);
        fputs(e.dsgn, fptr);
        fprintf(fptr, "%d \n%f \n%d \n", e.age, e.slry, e.empID);
       // fwrite(&e,recsize,1,fptr);
        fflush(stdin);
        printf("\nDo you want to input more? (y/n): ");
        next = getche();
        printf("\n");


    
    while(next !='n');

    fclose(fptr);


void list ()

    /* what is going on here??? */
    while(fread(&e,recsize,1,fptr)==1)
    
        printf("\n%s %s %s %s %d %.2f %d",e.name,e.sex,e.adrs,e.dsgn,e.age,e.slry,e.empID);
    

    getche();
    return ;


void edit ()

    char next;
    do
    
        printf("Enter the employee name to be edited: ");
        scanf("%s", empname);
        while(fread(&e,recsize,1,fptr)==1)
        
            if(strcmp(e.name,empname) == 0)
            
                printf("\nEnter new name,sex,address,designation,age,salary,employee ID ");
                scanf("%s %s %s %s %d %.2f %d",e.name,e.sex,e.adrs,e.dsgn,&e.age,&e.slry,&e.empID);
                fseek(fptr,-recsize,SEEK_CUR);
                fwrite(&e,recsize,1,fptr);
                break;
            
        
        printf("\nEdit another record(y/n)");
        next = getche();
        fflush(stdin);

    
    while(next != 'n');


    return ;


void del()

    char next;
    do
    
        printf("\nEnter name of employee to delete: ");
        scanf("%s",empname);
        ftemp = fopen("Temp.dat","wb");
        while(fread(&e,recsize,1,fptr) == 1)
        
            if(strcmp(e.name,empname) != 0)
            
                fwrite(&e,recsize,1,ftemp);
            
        

        fclose(fptr);
        fclose(ftemp);
        remove("ems.txt");
        rename("Temp.dat","ems.txt");
        fptr = fopen("ems.txt", "rb+");
        printf("Delete another record(y/n)");
        fflush(stdin);
        next = getche();


    while(next !='n');

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

您没有正确遵循格式,即:在打印字符时使用%s,例如:这里printf("\n%s %s %s %s %d %.2f %d",e.name,e.sex,e.adrs,e.dsgn,e.age,e.slry,e.empID); 您使用%s 表示e.sex,这只是一个字符。 并使用%s 多次通过scanf 获取e.sex 之类的字符输入,例如:scanf("%s %s %s %s %d %.2f %d",e.name,e.sex,e.adrs,e.dsgn,&amp;e.age,&amp;e.slry,&amp;e.empID);,改用%c。 在以格式化方式获取输入和打印输出时修复这些格式,然后查看。

您可以向printf man page 和scanf man page 寻求帮助以获取详细信息。

【讨论】:

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

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

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

C语言输出格式和类型

Xcode 错误“冲突类型”为一个非常简单的函数运行 C 代码

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

c语言double类型输出问题及字符输入问题