以下 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,&e.age,&e.slry,&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]
Xcode 错误“冲突类型”为一个非常简单的函数运行 C 代码