2012-03-05 77 views
0

的陣列我每當我試圖Strucs的數組傳遞到功能正在不斷地得到這個錯誤。創建的Structs

10:錯誤:預期的聲明說明符或「...」前‘記錄’ 113:錯誤:衝突的類型‘編輯’ 10:錯誤:的‘編輯’先前的聲明在這裏

我也得到了我如何使用strlen和STRCMP有關的參數,以及如何我正在從int的指針沒有投很多的警告。這有什麼不對嗎?

任何人都可以向我解釋什麼錯我到目前爲止的代碼?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXLENGTH 51 //longest length of a single record + 1 =51 bytes 
#define SIZEOFDB 1000 
#define ENCRYPT 5 

void add(int argc, char *argv[]); 
void del (char *username); 
void edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr); 
int verify (char *username, char *password); 
void parse (char *record, char *delim, char); 

typedef struct rec 
{ 
char name[22]; 
char pw[22]; 
char type[6]; 
}RECORD; 

int main(int argc, char *argv[]){ 
int j; 
char tempName[22]; 
char tempPw[22]; 
char tempType[6]; 
char newName[22]; 
char newPw[22]; 
char newType[6]; 
static const char filename[] = "password.csv"; 
FILE *file; 
file = fopen(filename, "r+"); 

if (file == NULL){ 
    //create csv file password.csv 
    printf("Just created password.csv"); 
    file = fopen(filename, "w+"); 
} 
size_t i =0, count, size = 1000; 
RECORD *arr = malloc(size * sizeof *arr); 
if (arr){ 
    char line[51]; 
    while(i<size && fgets(line, sizeof(line), file)){ 
     sscanf(line, "%[^','],%[^','],%s", &arr[i].name, &arr[i].pw, &arr[i].type); 
     ++i; 
    } 

    fclose(file); 

    if (strcmp(argv[1], "-menu") == 0){ 
     //menu function 
     printf("MENU\n"); 
    } else if(strcmp(argv[1], "-add") == 0){ 
     //add function 

     strncpy(newName,argv[2],strlen(argv[2])); 
     strncpy(newPw,argv[3],strlen(argv[3])); 
     strncpy(newType,argv[4], strlen(argv[4])); 

     printf("ADD\n"); 
    } else if(strcmp(argv[1], "-del") == 0){ 
     //del function 

     strncpy(tempName,argv[2], strlen(argv[2])); 

     printf("DEL\n"); 
    } else if(strcmp(argv[1], "-edit") == 0){ 
     //edit funciton 

     strncpy(tempName,argv[2],strlen(argv[2])); 
     strncpy(tempPw,argv[3],strlen(argv[3])); 
     strncpy(tempType,argv[4],strlen(argv[4])); 
     strncpy(newName,argv[5], strlen(argv[5])); 
     strncpy(newPw,argv[6], strlen(argv[6])); 
     strncpy(newType, argv[7], strlen(argv[7])); 

     printf("EDIT\n"); 
    } else if(strcmp(argv[1], "-verify") == 0){ 
     //verify function 

     strncpy(tempName,argv[2],strlen(argv[2])); 
     strncpy(tempPw,argv[3],strlen(argv[3])); 

     printf("VERIFY\n"); 
    } else { 
     printf("SYNTAX ERROR\n"); 
     return 0; 
    } 
    for (j = 0; j < i; j++){ 
     printf("%s,%s,%s\n", arr[j].name,arr[j].pw,arr[j].type); 
    } 
} 
free (arr); 



return 0; 

} 

/*void add(char nName[],char nPw[], char nType[], record *arr,FILE *file;){ 
int i,j; 
if (arr){ 
char line[51]; 
while(i<size && fgets(line, sizeof(line), file)){ 
sscanf(line, "%[^','],%[^','],%s", &arr[i].name, &arr[i].pw, &arr[i].type); 
++i 
} 

}*/ 

void edit(char *nName,char *nPw, char *nType, char *tName, char *tPw, RECORD *arr){ 
int i,j; 
int size = (sizeof *arr)/(sizeof arr[0]); 
for (i=0; i< size; i++){ 

if ((strcmp(arr[i].name, *tName) == 0 && strcmp (arr[i].pw, *tPw) == 0)){ 
for (j=0; j<size; j++){ 
if (strcmp(*nName, arr[j].name) == 0){ 
printf("ERROR USERNAME ALREADY EXISTS"); 
break; 
} 
} 
strncpy(arr[i].name, *nName, strlen(*nName)); 
strncpy(arr[i].pw, *nPw, strlen(*nPw)); 
strncpy(arr[i].type, *nType, strlen(*nType)); 
} 
} 

} 

感謝

+3

函數聲明這是一些可怕的縮進之前。 – bernie 2012-03-05 19:47:10

+0

對不起。我是從vim複製這個,它不太好。 – 2012-03-05 20:47:41

回答

2

你需要你在參數列表中使用它之前聲明RECORD結構。也就是說,你應該把它移到你的函數的前向聲明之前。

+0

我在哪裏申報?當我創建數組? 'RECORD * ARR = malloc的(尺寸*的sizeof * ARR);' – 2012-03-05 19:49:05

+0

只是移動,與'typedef'開始,以'RECORD結束位;'函數原型的上方。 – 2012-03-05 21:22:59

+0

@YamatoC:C編譯器從上往下處理文件的方式,所以'的typedef ... RECORD'需要RECORD'的'源文件中的任何其他發生之前出現。在這種情況下,編譯器看到'的'edit'原型RECORD',說:「你還沒有告訴我'RECORD'是什麼,所以我無法處理此聲明。」 – 2012-03-05 23:52:08

0

嘗試是這樣的:

typedef struct rec 
{ 
char name[22]; 
char pw[22]; 
char type[6]; 
}RECORD; 

void add(int argc, char *argv[]); 
void del (char *username); 
void edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr); 
int verify (char *username, char *password); 
void parse (char *record, char *delim, char); 

代替:

void add(int argc, char *argv[]); 
void del (char *username); 
void edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr); 
int verify (char *username, char *password); 
void parse (char *record, char *delim, char); 

typedef struct rec 
{ 
char name[22]; 
char pw[22]; 
char type[6]; 
}RECORD; 
0

嘗試把結構定義爲「記錄」的「編輯」