2017-12-23 2 views
1

str.cpy를 사용하여 2 차원 배열을 작성하려고하는데 프로그램이 실패합니다. 코드는 4 개의 배열을 받아서 그 내용을 일치하는 배열에 복사합니다.C - 2 차원 배열에 strcpy를 사용하는 방법?

int InsertStudent(char *firstName, char* lastName, char* dynCourses, char *dynGrades, 
     char firstNames[50][20], 
     char familyNames[50][20], char courses[50][5][20], 
     char grades[50][5]) 
    { 
     int set, 
     int cset = 0; 
     for (set = 0; set <= (50); set++) 
     { 
      if (firstNames[set][cset] == '\0') 
      { 
       strcpy(firstNames[set][cset], firstName); 
       strcpy(familyNames[set], lastName); 
       for (cset = 0; cset <= 5; cset++) 
       { 
        strcpy(courses[set], dynCourses); 
        strcpy(grades[set], dynGrades); 
       } 

      } 
     } 
     return 0; 
    } 
+3

구조체를 살펴 보았습니까? 그런 식으로 조금 더 객체 지향적으로 만들 수 있습니다. –

+1

구조에 대해 아직 배웠습니까? 아마도 인자리스트가 구조체 타입의 배열 하나를 요구하기 때문에 아마도 그렇지 않을 것이다.'struct Student {char firstName [20]; char 패밀리 명 [20]; char 코스 [5] [20]; char 성적 [5]; };'- 또는 심지어'struct course {char name [20]; 숯 등급; }; struct student {char firstName [20]; char 패밀리 명 [20]; 구조 코스 과정 [5]};'. –

+0

firstname, familyname, grades 및 courses라는 이름의 데이터 배열은 스택에서 모두 로컬이므로 데이터를 배치하는 모든 연산은 함수가 종료 될 때와 같이 해당 데이터가 '범위를 벗어 났을 때 사라집니다. – user3629249

답변

3
  • 잘 분명히 오류가 잘못 strcpy을 사용하고 있습니다.

    올바른 방법

    strcpy(firstNames[set], firstName); 
    
  • 은 또한 루프는 관용적 C 루프 <하지 <=를 사용 for (int i = 0; i < MAX; i++) 것을

    for (cset = 0; cset < MAX_COURSES; cset++) 
        { 
         strcpy(courses[cset], dynCourses); 
         strcpy(grades[cset], dynGrades); 
        } 
    

    참고되어야 할 것이다.

strcpy 함수의 서명은

char *strcpy(char * restrict s1, const char * restrict s2); 

이전에 당신이 s1 숯불 대신 char* 대신 전달됩니다. 경고 (사용 가능할 경우)가 있어야합니다. 그렇지 않으면 모든 컴파일러 플래그를 -Wall -Werror으로 설정하십시오.

   if (firstNames[set][cset] == '\0') 

그러나 처음에는 초기화되지 않은 값을 \0으로 확인합니다. 이것은 틀림없이 거짓이라고 판명 될 것입니다. 문자열을 포함하지 않는 char 배열이 자동으로 0으로 초기화 될 것이라는 보장은 없습니다. 그래서 확인하십시오 당신은 루프가 0에서 MAX_STUDENTS이다이

char arr[20][50]={0}; 
  • 처럼 호출 수신자 함수에서 문자 배열을 초기화했다. MAX_STUDENTS가 50보다 크거나 같으면 배열 범위를 벗어나는 배열 인덱스에서 반복되는 정의되지 않은 동작을 호출합니다. MAX_COURSES도 마찬가지입니다. 루핑이 더 명확하게 for (set = 0; set < (50); set++)이됩니다.

  • 초기화와 복사 부분을 별도로두면 훨씬 더 좋은 방법이 될 것입니다. 그렇지 않으면 유지 관리가 어려울 수 있습니다.

  • 사용에 courses를 보는 것은 당신이 같은이

    char courses[5][20]; 
    

처럼 선언 할 것은 분명하다는 grades 배열에 간다. 여기서 문자열을 2 차원 배열로 복사하려고했습니다. 컴파일러는 타입 비 호환성에 대해 불평 할 것이다.

  • 또한이 함수에서는 의미있는 결과를 반환하지 않았습니다. 올바른 방법은 새 이름이나 정보가 추가 된 색인 값을 반환하는 것입니다.

  • 여기서 dynGradesdynCourses의 내용을 배열에 복사하고 있습니다. 그래서 그들은 모두 같은 가치들을 포함하게 될 것입니다.이게 니가 원하는거야? 왜냐하면 5 개의 별개의 char 배열을 유지하는 용도는 무엇인가? 하나는 목적을 잘 처리 할 수 ​​있습니다.

+0

수정. 이것은 함수이며, 맞습니다. 반환 값을 학생의 색인으로 추가합니다. –

+0

@CSstudent :'struct '를 사용하는 법을 배우면 더 깨끗한 해결책을 찾을 수 있습니다. – coderredoc

관련 문제