2012-12-17 8 views
2

저는 C 언어를 처음 사용하며이 문제에 접근하는 가장 좋은 방법을 찾으려고합니다. 나는 모두 char *의 2 문자열을 가지고 있습니다.C에서 두 char * 문자열의 차이 표시

문자열 자체에 여러 개의 \ n 문자가 있으며 대개 약 1000 자입니다. 다른 한 줄만 표시하고 싶습니다. 일반적으로 전체 문자열에서 한 문자 (또는 상대적으로 작은 숫자) 만 다를 수 있습니다. 그래서 나는 그 하나의 변경된 행 (\ n에서 \ n까지의 전체 문자열) 만 표시 할 수 있도록하려고했다.

아무에게도 코드를 작성하거나 코드 예제를 제공 할 것을 요구하지 않습니다. 이론적으로이 작업을 수행하는 가장 효율적인 방법은 무엇입니까?

나는 '\ n'기호를 구분 기호로 사용하고 두 문자열을 비교하기 위해 strcmp를 사용하여 strtok을 조사해 보았습니다. 그리고 두 문자열이 같지 않으면 그 문자열을 "old_data "및"new_data "배열. 이렇게하는 것이 나쁜 방법일까요?

조언이 도움이 될 것입니다.

답변

1

올바른 트랙에있는 것 같습니다 : strsep은 줄 바꿈으로 문자열을 청크하게합니다. 염두에 두어야 할 한 가지 사실은 원래의 문자열을 사용하고 축복과 저주가 될 수있는 새로운 메모리를 할당하지 않는다는 것입니다.

아마도 가장 효율적인 메모리 효율적인 방법은 "old_data"및 "new_data"값을 보유 할 포인터 배열을 할당 한 다음 복사하는 대신 원래 문자열을 직접 가리키는 포인터를 저장하는 것입니다 그 끈은 끝났다. 원래 두 개의 문자열이 계속 붙어 있거나/당신의 아래에서 벗어나지 않으면, 이것은 당신에게 상당한 메모리 덩어리를 저장할 수 있습니다.

배열에서 문자열을 제거하지 않으려면 배열을 구현하는 순진한 (그러나 효과적인) 방법은 개수와 용량이라는 두 가지 상태 변수를 유지하고 매번 용량을 두 배로 유지하는 것입니다 배열을 오버플로하려고합니다. 예 :

char **strArray = NULL; 
unsigned int capacity = 10; 
unsigned int count = 0; 

strArray = malloc(capacity * sizeof(char *)); 

/* on insert */ 
if (count == capacity) 
{ 
    capacity *= 2; 
    strArray = realloc(strArray, capacity * sizeof(char *)); 
} 

strArray[count++] = pointerIntoOriginalString; 

행운을 비네!

+0

멋진 것들, 제안에 감사드립니다! –

1

strtok()는 재진입 가능하지 않습니다. strtok을 사용하여이 작업을 수행하려는 경우 어레이를 순차적으로 반복해야합니다. strtok의 재진입적인 구현 인 strtok_r()을 사용하는 것이 좋습니다.

걱정할 필요가있는 또 다른 사항은 old_data 및 new_data 배열이 충분히 크거나 크기 조정이 가능한지 확인하는 것입니다.

char *new_data[2000]; 
char *old_data[2000]; 

당신이 얼마나 많은 줄 수 있습니다 좋은 아이디어를 가지고있는 것처럼 들리는 특히 이후 : 당신이 C에 새로운 있다면 당신이 뭔가를 선언 할 단지 수도 있지만 매트의 대답은, 배열의 크기를 조정하는 간단한 예를 보여줍니다 귀하의 버퍼에.

+0

입력에 대한 좋은 점을 보았습니다. strtok_r() 함수는 유용 할 것으로 보인다. –