strcat() 전에 strcpy()를 먼저 해야 하는 이유는 무엇입니까?
이 코드가 런타임 문제를 발생시키는 이유는 무엇입니까?
char stuff[100];
strcat(stuff,"hi ");
strcat(stuff,"there");
안 그렇습니까?
char stuff[100];
strcpy(stuff,"hi ");
strcat(stuff,"there");
strcat는 null-terminator를 찾아 문자열의 끝으로 해석하고 거기에 새 텍스트를 추가하여 프로세스에서 null-terminator를 덮어쓰고 연결의 끝에 새 null-terminator를 씁니다.
char stuff[100]; // 'stuff' is uninitialized
Null 터미네이터는 어디에 있습니까?stuff초기화되지 않았으므로 NUL로 시작하거나 NUL 내 어디에도 NUL이 없을 수 있습니다.
C++에서는 다음을 수행할 수 있습니다.
char stuff[100] = {}; // 'stuff' is initialized to all zeroes
이제 strcat을 수행할 수 있습니다. 왜냐하면 'stuff'의 첫 번째 문자는 null-terminator이므로 올바른 위치에 추가됩니다.
C에서는 여전히 'stuff'를 초기화해야 하는데, 이는 다음과 같은 몇 가지 방법으로 수행할 수 있습니다.
char stuff[100]; // not initialized
stuff[0] = '\0'; // first character is now the null terminator,
// so 'stuff' is effectively ""
strcpy(stuff, "hi "); // this initializes 'stuff' if it's not already.
첫번째 경우에는stuff가비지를 포함합니다.strcat대상과 원본 모두 적절한 null-terminated 문자열을 포함해야 합니다.
strcat(stuff, "hi ");
will scanstuff종지부를 찍는'\0'caracter, 복사를 시작할 위치"hi ". 이를 찾지 못하면 배열의 끝에서 실행되어 임의로 나쁜 일이 발생할 수 있습니다(즉, 동작이 정의되지 않음).
이 문제를 피할 수 있는 한 가지 방법은 다음과 같습니다.
char stuff[100];
stuff[0] = '\0'; /* ensures stuff contains a valid string */
strcat(stuff, "hi ");
strcat(stuff, "there");
또는 초기화할 수 있습니다.stuff빈 문자열로:
char stuff[100] = "";
모든 100 바이트를 채울 것입니다.stuff0의 경우(명확성이 향상된 것은 아마도 사소한 성능 문제에 대한 가치가 있을 것입니다).
왜냐면stuff에 대한 호출 전에 초기화되지 않았습니다.strcpy. 선언후stuff빈 문자열이 아니라 초기화되지 않은 데이터입니다.
strcat는 문자열 끝에 데이터를 추가합니다. 즉, 문자열에서 null 터미네이터를 찾고 그 다음에 문자를 추가합니다.초기화되지 않은 문자열에는 null 터미네이터가 있어야 하는 것은 아닙니다.strcat충돌할 가능성이 높습니다
만약 초기화를 한다면stuff아래와 같이 strcat을 수행할 수 있습니다.
char stuff[100] = "";
strcat(stuff,"hi ");
strcat(stuff,"there");
Strcat은 기존 문자열에 문자열을 추가합니다.문자열 배열이 비어 있으면 문자열 끝 찾기('\0') 및 실행 시간 오류가 발생합니다.
리눅스 맨 페이지에 따르면 단순 strcat은 다음과 같은 방식으로 구현됩니다.
char*
strncat(char *dest, const char *src, size_t n)
{
size_t dest_len = strlen(dest);
size_t i;
for (i = 0 ; i < n && src[i] != '\0' ; i++)
dest[dest_len + i] = src[i];
dest[dest_len + i] = '\0';
return dest;
}
이 구현에서 볼 수 있듯이,strlen(dest)그렇지 않으면 올바른 문자열 길이를 반환하지 않습니다.destc 문자열 값을 수정하도록 초기화됩니다.운 좋게도 첫번째 값이 0인 배열을 가질 수 있습니다.char stuff[100];, 하지만 그것에 의존해서는 안됩니다.
또한 사용하지 말 것을 권합니다.strcpy아니면strcat의도하지 않은 문제를 야기할 수 있기 때문입니다.
및 를 사용하면 버퍼 오버플로를 방지할 수 있습니다.
언급URL : https://stackoverflow.com/questions/18838933/why-do-i-first-have-to-strcpy-before-strcat
'programing' 카테고리의 다른 글
| 카르마가 주니트 플러그인을 로드할 수 없습니다. (0) | 2023.10.20 |
|---|---|
| PHP에서 이중 콜론 연산자와 화살표 연산자의 차이점은? (0) | 2023.10.20 |
| PL/SQL: 오류 "PLS-00306: 잘못된 번호 또는 호출 중인 인수 유형"이 번호 테이블에 대해 트리거되었습니다. (0) | 2023.10.20 |
| C++ 프로젝트에서 C 소스 파일을 어떻게 사용합니까? (0) | 2023.10.20 |
| 이미 가져온 모듈 편집 (0) | 2023.10.20 |