2014-01-09 2 views
-2

내 코드를 편집하는 하루 종일이지만 내 배열의 마지막 위치가 덮어 쓰기되는 이유를 찾을 수 없습니다 !!간단한 C 운동. 마지막 위치가 덮어 쓰여집니다

#include <stdio.h> 
#include <math.h> 
#include <ctype.h> 
#include <string.h> 
#include <stdlib.h> 

typedef struct Person{ 
    char *name; 
    char *surname; 
    char *address; 
    char *number; 
} Person; 

char * getString(void); 

int main(void) { 
    struct Person *rub = NULL, *ttmp = NULL; 
    int idx=0,i,j,k; 
    char c; 
    char *tmp = NULL; 
    do{ 
     printf("*******************************\ni - Insert new\n"); 
     printf("n - Find by name\n"); 
     printf("c - Find by surname\n"); 
     printf("e - Delete\n"); 
     printf("p - Print list\n"); 
     printf("0 - Exit\n*******************************\n"); 
     c = getchar(); 
     printf("%d\n",c); 
     getchar(); 
     switch(c){ 
      case 'i': 
       ttmp = (struct Person *) realloc(rub, (idx+1)*sizeof(Person)); 
       if(ttmp == NULL){ 
        printf("Cannot allocate more memory.\n"); 
        exit(1); 
       } 
       else 
        rub = ttmp; 
       printf("Nome: "); 
       tmp = getString(); 
       rub[idx].name = (char *) malloc(strlen(tmp)); 
       rub[idx].name = tmp; 
       //printf("Surname: "); //commented in order to test faster 
       //tmp = getString(); 
       rub[idx].surname = (char *) malloc(strlen(tmp)); 
       rub[idx].surname = tmp; 
       //printf("Address: "); 
       //tmp = getString(); 
       rub[idx].address = (char *) malloc(strlen(tmp)); 
       rub[idx].address = tmp; 
       //printf("Number: "); 
       //tmp = getString(); 
       rub[idx].number = (char *) malloc(strlen(tmp)); 
       rub[idx].number = tmp; 
       idx++; 
       for(k=0;k<idx;k++){ 
        printf("%d) %s %s\n%s\n%s\n-------------------\n", k+1, rub[k].name,rub[k].surname,rub[k].address,rub[k].number); 
       } 
       break; 
      case 'n': 
       printf("What name are you looking for? "); 
       scanf("%s",tmp); 
       for(k=0;k<idx;k++){ 
        if(strcmp(rub[k].name,tmp) == 0){ 
         printf("%s\n%s\n%s\n%s\n", rub[k].name,rub[k].surname,rub[k].address,rub[k].number); 
        } 
       } 
       break; 
      case 'c': 
       printf("What surname are you looking for? "); 
       scanf("%s",tmp); 
       for(k=0;k<idx;k++){ 
        if(strcmp(rub[k].surname,tmp) == 0){ 
         printf("%s\n%s\n%s\n%s\n", rub[k].name,rub[k].surname,rub[k].address,rub[k].number); 
        } 
       } 
       break; 
      case 'e': 
       printf("Select number to delete record:\n "); 
       for(k=0;k<idx;k++){ 
        printf("%d) %s %s\n", k+1, rub[k].name,rub[k].surname); 
       } 
       scanf("%d",&j); 
       ttmp = NULL; 
       for(k=0,i=0;k<idx;k++){ 
        if(k+1 != j){ 
         ttmp = (struct Person *) realloc(ttmp, (i+1)*sizeof(Person)); 
         ttmp[i].name = (char *) malloc(strlen(rub[k].name)); 
         ttmp[i].surname = (char *) malloc(strlen(rub[k].surname)); 
         ttmp[i].address = (char *) malloc(strlen(rub[k].address)); 
         ttmp[i].number = (char *) malloc(strlen(rub[k].number)); 
         ttmp[i].name = rub[k].name; 
         ttmp[i].surname = rub[k].surname; 
         ttmp[i].address = rub[k].address; 
         ttmp[i].number = rub[k].number; 
         i++; 
        } 
       } 
       --idx; 
       rub = (struct Person *) realloc(ttmp, (idx)*sizeof(Person)); 
       for(k=0;k<idx;k++){ 
        printf("%d/%d) %s %s\n%s\n%s\n-------------------\n", k,idx, rub[k].name,rub[k].surname,rub[k].address,rub[k].number); 
       } 
       break; 
      case 'p': 
       for(k=0;k<idx;k++){ 
        printf("%d) %s %s\n%s\n%s\n-------------------\n", k+1, rub[k].name,rub[k].surname,rub[k].address,rub[k].number); 
       } 
       break; 
      case '0': 
       return 0; 
       break; 
     } 
     fseek(stdin,0,SEEK_END); 
    } 
    while(c != 0); 
    return 0; 
} 

char * getString(void){ 
    char *stringa = NULL, c; 
    int i=0; 
    stringa = malloc(sizeof(char)); 
    while((c=getchar()) != '\n'){ 
     stringa = (char *) realloc(stringa, (i+1)*sizeof(char)); 
     stringa[i++] = c; 
    } 
    stringa[i] = '\0'; 
    return stringa; 

} 

내 입력입니다 (동일한 입력을 입력하고 동일한 오류가 발생하면 알려주세요). 나는이 예를 들어 바보 무작위 단어를 사용합니다 : 여기

i 
asd 
i 
qwe 
i 
zxc 
p 
n 
asd 
p 

내 마지막 'P'명령의 출력 :

1) asd asd 
asd 
asd 
------------------- 
2) qwe qwe 
qwe 
qwe 
------------------- 
3) asd asd 
asd 
asd 
------------------- 

배열의 마지막 위치가 같은되었다 왜 먼저?? 코드에 대한 다른 조언이나 제안을 환영합니다 !!

감사

+0

페이스트 빈은 그래서 당신이 사이트에 직접 코드를 게시 할 것으로 예상된다 최고의 서비스를 위해 – Hogan

+0

를 도울 수 방화벽된다. – suspectus

+0

당신이 downvote 때, 내가 뭘 잘못 이해할 수 있도록 의견을 주시기 바랍니다 ... 그렇지 않으면 downvote !! – Yuri

답변

1

에 따라 realloc 함수해야합니까?

case 'n': 
    printf("What name are you looking for? "); 
    scanf("%s",tmp); 

tmp를 재사용된다. (case 'c':도)

변경 예컨대

case 'n': 
    printf("What name are you looking for? "); 
    tmp=getString(); 
    for(k=0;k<idx;k++){ 
     if(strcmp(rub[k].name,tmp) == 0){ 
      printf("%s\n%s\n%s\n%s\n", rub[k].name,rub[k].surname,rub[k].address,rub[k].number); 
     } 
    } 
    free(tmp); 
    break; 

rub[idx].name = (char *) malloc(strlen(tmp)); 
rub[idx].name = tmp; 
//As well as in other like 

메모리 누출

한다.

rub[idx].name = tmp;//by getString() 
1

나는 전체 코드를 읽을 수는 있지만 잘못된 것이 코드를 발견 din't :

stringa = malloc(sizeof(char)); 
while((c=getchar()) != '\n'){ 
    stringa = (char *) realloc(stringa, sizeof(char)); 

당신은 realloc을 - 보내고 항상 한 바이트이며, 문자열 느 베르는 자라!

당신은 배열의 마지막 위치가 처음과 같은되었다 왜 변수 i

+0

조언을 주셔서 감사합니다. 코드를 수정했지만 여전히 같은 오류가 발생합니다. – Yuri