:
- 이 호출자에게 할당 대상 버퍼를 반환하여
find_replace()
기능을 제공하지 않으며,
- 이 안정적으로 충분히 할당하지 않습니다 목적지 버퍼를위한 공간.
원칙적으로 문제 (1)은 두 가지 방법으로 해결 될 수 있습니다. 공간은 호출자에 의해 할당 될 수 있고 함수에 전달 된 포인터가 함수에 의해 할당되거나 포인터가 호출자에게 반환 될 수 있습니다. 원래 코드는 함수에 공백을 할당하지만 은 호출자에게에 대한 포인터를 반환하지 않습니다.
호출자가 수행 할 것을 주장하는 것보다 입력 (2)를 만족시키기 위해서는 입력을 철저히 분석해야하기 때문에 함수가 할당을 수행하는 것이 바람직합니다.이 작업을 수행 할 때 수정 된 코드에서 무슨 생각해
char dest[4];
int canary = 0;
find_replace("aaa", "a", "longer string", dest);
assert(canary == 0);
당신이 가능하게 당신이 어설 션 오류를 얻는다면, 아마도 당신이 얻을, 세그먼트 폴트를 얻을 가능성이 높습니다 - 누가 알 - 무엇을, find_replace()
이없이 작업을 수행 할 수 없기 때문에 dest
의 끝을 지나서 쓰고 그 결과는 정의되지 않습니다.
운동을 수행 할 때 함수에 반환 값 (예 : void
)이 필요하지 않지만 사용자는 인수 목록을 통해 대상 문자열에 대한 포인터를 반환 할 수 있습니다. 해당 값 대신 포인터을 포인터로 전달하면 함수가 해당 값을 업데이트 할 수 있습니다. 서명은 다음과 같을 것입니다 : (. 함수가 문자열 리터럴을 수용하기위한 것입니다 경우, 적절한 경우에는 필요하지 않습니다 src
, from
및 to
에 대한 const
qualifers를 참고)
void find_replace(const char *src, const char *from, const char *to,
char **dest_p);
dest
에 필요한 공간은 src
의 길이와 더하기자를위한 것입니다. 이 from
보다 길면 to
과 from
문자열의 길이의 차이와의 모양의 수를 곱합니다.문자열. 그러나 그 길이에 대한 상한을 계산할 수 있고, 나중에 실제로 사용 된 공간의 양을 알게 된 후에 (필요한 경우) 할당을 축소 할 수 있습니다. 예를 들어이 결국, 숙제 때문에
void find_replace(const char *src, const char *from, const char *to,
char **dest_p) {
ssize_t src_size = strlen(src);
ssize_t from_size = strlen(from);
ssize_t to_size = strlen(to);
char *temp;
if (!from_size) {
/* special case: the 'from' string is empty ... */
/* whatever you do, set temp to something valid or NULL */
} else {
ssize_t size_diff = to_size - from_size;
if (size_diff < 0) size_diff = 0;
temp = malloc(1 + src_size + (src_size/from_size) * size_diff);
if (temp) {
/* use next to track the next unused position in temp */
char *next = temp;
/*
* perform the substitution, updating 'next' appropriately as
* you go along (INSERT CODE AFTER THIS COMMENT) ...
*/
/* be sure to terminate: */
*(next++) = '\0';
/* shrink the string to the actual space used (optional): */
next = realloc(temp, next - temp);
/*
* On (re)allocation error, next will be NULL and temp will still
* be a valid pointer. Otherwise, next will be a pointer to the
* space, not necessarily equal to temp, and temp might no longer
* be a valid pointer.
*
* An OK error recovery strategy is to just return a pointer
* to the full-size space.
*/
if (next) {
temp = next;
}
} /* else allocation failure; return NULL */
}
/*
* The caller gets a pointer to the allocated space (if any). It is his
* responsibility to free it when it is no longer needed.
*/
*dest = temp;
}
실제 대체 코드는 연습으로 남아 있습니다.
문자열 리터럴은 C에서 수정할 수 없습니다. – ouah
그래, 깨달았지만 그게 내 seg 오류의 원인이라고 생각하지 않습니다. –
모든 경고가 용의자가 아닙니다. 제안 - 벽 – chux