2014-11-26 4 views
1

문자열에서 단어/단어를 바꿀 수있는 방법을 찾고 있습니다. 이 같은 기능을 사용하는 경우의 말을하자C에서 문자열 내부의 단어 교체

changewords("Hello I'm Number One","Number One","Zero"); 

출력이 같이 될 것입니다 : "안녕하세요 난 넘버원"-이

하지만 더 "안녕하세요 제로 해요"> 나는 것 이 같은 단 하나의 단어도

changewords("Hello I'm Number One","One","Four"); 

을 대체 할 수 : "안녕하세요 나는 번호 하나있어"-> 내 코드에서

"안녕하세요 나는 4 번 해요"나는 단어 문장을 분할하여 비교 각 단어를 단어로 내가 바꿀 필요가 있지만 그런 식으로 단 하나의 단어 만 바꿀 수 있습니다. 어느 한 방법으로 올바르게 할 수 있습니까? 감사합니다. . 여기 내 코드는 행렬 (테이블)의 한 줄을 문장으로 사용하고 줄 번호는 sentenceToChange 변수입니다.

int changewords (char table[][MAX_SENTENCE_LENGTH], int numOfSentences, int sentenceToChange, char subString[],char replaceWith[]){ 
int slen,i=0,q=0,c=0; 
char wordlist[100][100]; 
char final[1][100]; 
slen=strlen(table[sentenceToChange]); 
for(i=0;i<slen;i++) { 
    if(table[sentenceToChange][i]!=' '){ 
     wordlist[q][c]=table[sentenceToChange][i]; 
    c++; 
    } 
    else { 
     wordlist[q][c]='\0'; 
     c=0; 
     q++; 
    } 
} 
for(i=0;i<q;i++) { 
if (!strcmp(wordlist[i],subString)) { 
strcpy(wordlist[i],replaceWith); 
} 
} 
final[0][0]='\0'; 
for(i=0;i<=q;i++) { 
strcat(final[0],wordlist[i]); 
if(i!=q) strcat(final[0]," "); 
} 
final[0][slen-1]='\0'; 
strcpy(table[sentenceToChange],final[0]); 

} 않는 strstr 작동 것에 대해 위에서 언급 한 무엇

+1

당신은 그것을 너무 복잡하게 만들고있어 - 방금 대상 문자열에 대한 호출 다음 몇 가지를 찾아'strstr'을 사용' memmove'를 사용하여 새 문자열을 삽입하고 나머지 부분을 조정하십시오. –

+1

위의 내용을 추가하면 ...'strstr()'과 일치하는 단어를 찾은 후에 더 긴 단어의 일부와 일치하는 경우 앞뒤의 문자가 알파/영숫자가 아닌지 확인할 수 있습니다. – Dmitri

+0

귀하의 조언과 도움에 감사드립니다. – Matan

답변

2

필요한 경우 두 가지 전략을 모두 사용할 수 있습니다.목적지로 한 번에

  1. 복사 한 문자, find에 앞서 검사 및 replace를 삽입 발견했을 때, 찾을 수 없습니다 오리지널 캐릭터; 목적지로 한 번에
  2. 복사 한 단어 앞서 findreplace를 삽입 스캔 발견했을 때, 찾을 수없는 원본 텍스트 - 당신은 단지 문자 find 텍스트가 아닌, 전체 단어를 바꾸려면이 필요합니다;
  3. 라이브러리 함수를 사용하여 find 텍스트를 검색합니다.

전략 사용는

  1. 대소 문자 등의 추가 (언급되지 않은) 요구 사항에 따라 달라집니다?
  2. 전체 단어 만?
  3. 한 번만 바꾸거나 모든 항목을 바꿉니 까?
  4. find 또는 replace 중 하나가 공백으로 시작 및/또는 끝날 수 있으며 이러한 중요도가 있습니까?

더 어려운 것 중 하나는 새로운 문자열에 필요한 메모리를 평가하는 것입니다. 아래에는 항상 하나의 문자열이 발견되어 대체 된 것으로 가정합니다. findchange을 사전 스캔하지 않고 '임의의'새로운 문자열 길이를 맞추려면 sentence의 모든 문자를 replace으로 대체 할 수 있다고 가정하는 것이 더 안전한 방법입니다. 즉, 대상이 차지할 최대 메모리 양은 strlen(sentence)*strlen(replace)+1입니다. +1은 언제나 그렇듯이 종료되는 0을 저장하는 것입니다. 출력을 보여줍니다

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *changewords_1 (char *sentence, char *find, char *replace) 
{ 
    char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1); 
    char *destptr = dest; 

    *dest = 0; 

    while (*sentence) 
    { 
     if (!strncmp (sentence, find, strlen(find))) 
     { 
      strcat (destptr, replace); 
      sentence += strlen(find); 
      destptr += strlen(replace); 
     } else 
     { 
      *destptr = *sentence; 
      destptr++; 
      sentence++; 
     } 
    } 
    *destptr = 0; 
    return dest; 
} 

char *changewords_2 (char *sentence, char *find, char *replace) 
{ 
    char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1); 
    char *destptr = dest; 

    *dest = 0; 

    while (*sentence) 
    { 
     if (!strncmp (sentence, find, strlen(find)) && 
      (sentence[strlen(find)] == 0 || sentence[strlen(find)] == ' ')) 
     { 
      strcat (destptr, replace); 
      sentence += strlen(find); 
      destptr += strlen(replace); 
     } else 
     { 
      while (*sentence && *sentence != ' ') 
      { 
       *destptr = *sentence; 
       destptr++; 
       sentence++; 
      } 
      while (*sentence == ' ') 
      { 
       *destptr = *sentence; 
       destptr++; 
       sentence++; 
      } 
     } 
    } 
    *destptr = 0; 
    return dest; 
} 

char *changewords_3 (char *sentence, char *find, char *replace) 
{ 
    char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1); 
    char *ptr; 

    strcpy (dest, sentence); 

    ptr = strstr (dest, find); 
    if (ptr) 
    { 
     memmove (ptr+strlen(replace), ptr+strlen(find), strlen(ptr+strlen(find))+1); 
     strncpy (ptr, replace, strlen(replace)); 
    } 

    return dest; 
} 


int main (void) 
{ 
    char *result; 

    result = changewords_1 ("Hello I'm Number One","Number","Index"); 
    printf ("[%s]\n", result); 
    free (result); 

    result = changewords_2 ("Here Is The Onerous Number One ...","One","Four"); 
    printf ("[%s]\n", result); 
    free (result); 

    result = changewords_3 ("Here Is Number One Again","One","Fourty-Five Hundred"); 
    printf ("[%s]\n", result); 
    free (result); 

    return 0; 
} 

.. :

[Hello I'm Index One] 
[Here Is The Onerous Number Four ...] 
[Here Is Number Fourty-Five Hundred Again] 
+0

고마워, 잘 했어! – Matan

2

. 사실 여기에 예제가 있습니다 http://www.cplusplus.com/reference/cstring/strstr/

어떤 이유로 strstr을 사용할 수없는 경우 다음을 수행 할 수 있습니다.

1) 바꾸려는 단어의 첫 번째 문자를 찾으려면 첫 번째 문자열을 문자 단위로 검색하십시오. 발견되면 해당 위치의 색인을 저장하십시오. 1.

3 단계로 돌아갈 경우 당신은 당신이 대체 할 문자열의 끝에 도달하면

2) 첫 번째 문자를 찾은 후), 각 문자가 일치 확인을 계속 저장 그 위치의 인덱스

4) 치환을 수행 할 문자열의 나머지 문자를 임시 문자열에 저장하십시오.

5))

6 단계에서 발견 된 인덱스에 대체 문자를 복사하여 1 단계의 인덱스 플러스 교체 문자의 길이로 나타낸 위치에 임시 문자열에서 저장된 문자를 복사합니다.

사용하는 방법에 관계없이 기억해야 할 중요한 사항이 있습니다.

1) 교체 문자열이 원본보다 길어질 수 있으므로 새 문자열에 할당 된 메모리가 교체 문자열을 보유하기에 충분한 지 확인하십시오.

2) 새 문자열 끝에 null 문자를 넣습니다.

1
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] ="This is a simple string made with simple code"; 
    char * pch; 
    int i=0,count=0; 
    for(i=0;i<strlen(str);i++){ 
    if(str[i]=='s'&& str[i+1]=='i'&&str[i+2]=='m'&&str[i+3]=='p' && str[i+4]=='l' && str[i+5]=='e'){ 
     count++; 
     } 
    } 
    for(i=1;i<=count;i++){ 
    pch = strstr (str,"simple"); 
    strncpy (pch,"sample",6); 
    } 

    puts (str); 
    return 0; 
}