最初,我想创建一个用户输入用户名和密码的程序。程序检查两者是否在编码结构内。如果输入正确,程序将显示一定数量。
但是我已经省略了剩下的代码,因为我总是在isValid上得到错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct accounts{
char unList[50];
int pinList;
float amtList;
}account;
int isValid(char inputUN[], struct accounts);
int main(int argc, char *argv[]) {
account newAccs[10];
char unList[][32] = {"franklin", "woods", "phillips", "gomez", "burns", "porter", "griffin", "spencer", "hanson", "johnson"};
char inputUN[32];
int index;
printf("Enter Username: ");
scanf("%s", &inputUN);
printf("Enter PIN: ");
scanf("%d", &inputPin);
index = isValid(inputUN, newAccs);
printf("%d", index);
return 0;
}
int isValid(char inputUN[], struct accounts acount){
int index;
for(index = 0; index < 32; index++){
if (strcmp(inputUN, acount.unList) == 0){
index = index;
}
}
return index;
}
注意:我不需要原始程序的代码。我只是想知道为什么我总是会收到错误:&#39; isValid&#39;的argument2的类型不兼容。 我也缩短了我的代码,仅用于我的目的。
答案 0 :(得分:3)
newAccs
是这些结构的数组,它会在将第一个元素传递给函数时衰减为指向第一个元素的指针。
因此,如果您想使用指针,则需要您的函数接受account *
。如果您需要单个帐户元素,则需要传递一个,例如使用newAccs[4]
。
您选择哪一个取决于您的意图(由于它不是基于您当前的isValid
功能,现在有点难以辨别您想要去哪种方式尽管存在for
循环,但使用任何数组索引。
举例来说,这是一个功能(我认为可能是你所追求的,基于所提供的信息),它贯穿整个帐户集并检查用户名是否存在在其中一个条目中。它将返回该条目的索引,如果未找到则返回-1:
int findUN (char *userName, account *accountList, int accountSz) {
int idx;
for (idx = 0; idx < accountSz; idx++)
if (strcmp (userName, accountList[idx].unList) == 0)
return idx;
return -1;
}
然后用类似的东西来调用它:
int idx = findUN (inputUN, newAccs, sizeof(newAccs) / sizeof(*newAccs));
你会注意到我已经完成了两个的事情。第一种是接受指针到一个帐户结构(指向数组中十个中第一个的指针)。
第二种是传递该数组的大小,基本上是整个数组的字节大小除以该数组中一个元素的字节大小。
那是因为数组衰减成指针不会让你以后提取数组大小。为此,您需要单独传递它。
答案 1 :(得分:0)
方法isValid
期望accounts
的单个实例作为第二个参数,但是在调用方法时您将数组传递给它。
因此,您需要将方法签名更改为
int isValid(char inputUN[], struct accounts *);
或在将方法调用为
时从数组中传递accounts
的单个实例
isValid(inputUN, newAccs[someindex]);