2012-05-11 4 views
1

C에서 상속을 시뮬레이트하고 있지만 언어에 익숙하지 않습니다. 아래 코드 중 일부입니다. Visual Studio에 emp.name=n에 대한 오류 메시지가 표시됩니다.문자열을 편집하는 방법 (C 구조체)

표현식은 수정 가능 한 값이어야합니다.

어떻게 수정할 수 있습니까?

typedef struct {  
     char name[20]; 
     double salary; 
     } Employee; 

Employee newEmployee(char n[], double s) 
{ 
    Employee emp; 
    emp.name=n; 
    emp.salary=s; 
    return emp; 
} 

답변

5

당신은 n에서 Employee.name에 데이터를 복사해야합니다 n은 NULL로 종료하지 않은 경우

strncpy(emp.name, n, 20); 

그러나이 문제로 실행됩니다.

strncpy(emp.name, n, 19); 
emp.name[19] = '\0'; 
+1

아야, 'strncpy' 제발! – mvds

+0

'strncpy (emp.name, n, sizeof (emp.name) -1);'더 좋을 것이고 널 종료를 보장하기 위해서'emp.name [sizeof (emp.name) -1] = '\ 0'; '을 추가해야 할 것이다. –

1
당신은 strcpy()를 사용해야

또는 상대 (strncpy()memmove()는, memcpy()는, ...) C.

에 문자열을 복사 : emp.name은 NULL로 끝나는 문자열이 될 것이라는 점을 보장하기 위해 다음 코드를 사용하여
strcpy(emp.name, n); 

문자열 길이가 n 인 경우 Employee 구조의 name보다 짧다고 가정합니다. 그렇지 않은 경우 문제가 발생합니다.

1

다른 포스터는 strncpy를 사용하여 사용자를 안내합니다.

strcpy 대 strncpy 주변의 의견은 src 문자 버퍼가 null로 끝나야하므로 strcpy에서 발생합니다. 마지막 문자 '\ 0'문자 여야합니다. 이 규칙을 따르지 않으면 예기치 않게 세그먼트 화 오류로 인해 프로그램이 종료됩니다. 그 일이 생길 때 당혹 스럽습니다.

당신이 을 시도하여 숯불는 []를 를 시도했다 emp.name 당신의 구조체에 이름 요소의 주소를 수정하기 위해 할당하는 것이 지적되었다받은 오류 메시지. 메모리의 주소는 수정할 수 없습니다. 그래서 정확한 답변은 입니다. emp.name은 메모리의 주소이고 변경할 수 없으므로 수정할 수 없습니다.

그래서 당신의 머리에 당신은 내가 에 char 배열 N의 데이터로 emp.name을 수정하려는 생각하지만, emp.name의 주소는 불가능한 것입니다. strncpy는 char 배열 n에 포함 된 데이터를 emp.name 주소 이 가리키는 20 바이트로 복사합니다.

나는 이것을 잘 설명하지 않았을 수도 있습니다. 더 많은 질문을하십시오. 다른 포스터는이 답변을 수정하거나 수정할 수 있습니다.

이것은 C를 배우는 까다로운 부분입니다. 일부 어셈블리 언어를 공부하고 C 언어로 코딩 할 때 어셈블러 작성자보다 C 언어 키워드가 얇은 레이어가되므로 번개처럼 빠르고 오류가 발생하는 이유가 무엇인지 염두에 두어야합니다.