2014-12-29 3 views
1

일부 문자를 c-string 배열로 복사하는 데 어려움이 있습니다.정확한 문자 수를 복사하는 방법

기본적으로 배열의 크기가 25로 정의되고 사용자가 25자를 입력하면 오버플로이므로 25자를 저장하고 다른 char 배열의 내용을 삭제합니다.

\0 null 종료 문자를 고려해야한다는 것을 알고 있으므로 정확히 25자를 배열에 복사하는 방법이 있습니까?

이 내 헤더 파일 및 코드,

#define FIRSTNAME 25 
    #define SURNAME 128 
    #define ADDRESS 128 
    #define INFORMATION 128 

class Customers 
{ 
private: 
    char firstName[FIRSTNAME]; 
    char surname[SURNAME]; 
    char address[ADDRESS]; 
    char information[INFORMATION]; 


public: 
    Customers(); 

    void setFirstName(char *firstName); 
    void setSurname(char *surname); 
    void setAddress(char *address); 
    void setInformation(char *information); 

    const char* getFirstName() const {return firstName;}; 
    const char* getSurname() const {return surname;}; 
    const char* getAddress() const {return address;}; 
    const char* getInformation() const {return information;}; 

    ~Customers(); 

}; 

코드입니다 :

void Customers::setFirstName(char *firstName) 
{ 
    strncpy(this->firstName, firstName, FIRSTNAME); 
    this->firstName[FIRSTNAME - 1] = '\0'; 
} 

void Customers::setSurname(char *surname) 
{ 
    strncpy(this->surname, surname, SURNAME); 
    this->surname[SURNAME - 1] = '\0'; 
} 

void Customers::setAddress(char *address) 
{ 
    strncpy(this->address, address, ADDRESS); 
    this->address[ADDRESS - 1] = '\0'; 
} 

void Customers::setInformation(char *information) 
{ 
    strncpy(this->information, information, INFORMATION); 
    this->information[INFORMATION - 1] = '\0'; 
} 

이 코드는 위의 잘 작동하지만 복사 maximum size - 1 문자 이상. 나는, 모든 문자를 통해 복사하려면 어떻게 ...

void Customers::setFirstName(char *firstName) 
{ 
    strcpy(this->firstName, firstName); // IF *firstName is 25 characters, it stores 25 characters and erases what is in the surname variable 
} 

void Customers::setSurname(char *surname) 
{ 
    strcpy(this->surname, surname); // IF *surname is 128 characters, it stores 128 characters and erases what is in the address variable 
} 

void Customers::setAddress(char *address) 
{ 
    strcpy(this->address, address); // IF *address is 128 characters, it stores 128 characters and erases what is in the information variable 
} 

void Customers::setInformation(char *information) 
{ 
    strcpy(this->information, information); 
} 

나는 최대 크기의 문자를 복사하려면 아래에 다음 코드를 시도하지만, 다른 변수에 어떤 삭제합니다 심지어 경우 최대 크기입니까? 예를 들어 성이 실제로 128자인 경우 address 변수의 내용을 지우고 싶지 않습니다. 이 문제가 수정 되었습니까?

+1

왜'std :: string' 대신 C-string을 사용하고 있습니까? – Barmar

+0

그래서 C와 C++ 태그를 싫어합니다. – haccks

답변

1

질문을 올바르게 이해 한 경우 strncpy() 또는 memcpy()이 정확히 n 바이트를 복사합니다.

여기서 n 값을 주면서주의해야합니다. n가 제공된 타겟 버퍼의 사이즈와 동일 해, 소스의 최초의 n 바이트의 사이에 null 바이트가없는 경우, 종료하는 null에 남은 공간은 없다. 당신이 크기 n+1의 수 후 정확하게 n 바이트를 복사 배열을 정의하려면

그래서, IMO, 정확히 n 바이트를 복사하고 가변 번째 n에서 '\ 0'을 넣어 [고려 지수는 0에서 시작].

0

예. 가능합니다. 그러나이 경우 문자 배열을 문자열로 사용할 필요가 없습니다. 즉, 문자열 연산자를 적용하지 않아야합니다 (\0이 종료되지 않았고 정의되지 않은 동작을 호출하기 때문에).

해당 배열을 복사하려면 루프 또는 표준 라이브러리 함수 memcpy 또는 memmove을 사용할 수 있습니다.

+0

'memcpy'를 아십니까? –

0

결과 배열에서 str* 함수를 사용하지 마십시오.이 문자열은 종료 '\0' 바이트가 아닌 문자열이 아닙니다. 그것들을 문자열로 취급 할 수는 없지만 파일에 저장하고 싶다면 sizeof 연산자를 사용하여 내용을 복사 할 때 배열의 길이를 지정하면 유용합니다. 예를 들어 stdout에 글을 쓸 수 있습니다.

fwrite(array, 1, sizeof(array), stdout); 

등등.당신이 예를

에 필요한 바이트을 복사 정확히 수
strncpy(this->information, information, INFORMATION);  

이 추가됩니다 memcpy없이 종료 '\0'

memcpy(this->information, information, INFORMATION); 

것 때문에

또한

, 나는 그래서, memcpy 기능을 제안 나는 당신이 필요로하는 것입니다.

관련 문제