2013-03-26 2 views
0

++ C의 문자열에서 특정 문자를 교체 -코드 다음과 같이 내가 가진

Value = "Current &HT"; //this is value 
void StringSet(const char * Value) 
{ 
    const char *Chk = NULL; 
    Chk = strpbrk(Value,"&"); 
    if(Chk != NULL) 
    {  
    strncpy(const_cast<char *> (Chk),"&amp",4) 
    } 
} 

을 위의 코드에서 내가 가진 가치에서 "&"를 교체하고 싶습니다 "나는 경우 & amp.It 잘 작동합니다" & "단일 문자하지만 현재의 경우 strpbrk()에서 반환"& HT "아래를 strncpy 전체"& HT는 "대체됩니다.

이제

나는 단지에서 단일 문자를 대체 할 수있는 방법을 알고 싶습니다 문자열.

+3

왜 이것에 대한'표준 : string'를 사용하지 않을까요? 그것은'replace' 함수를 가지고 있습니다. – chris

+0

나는 그것을 사용하고 싶지만 이미 정의 된 프로그램에서 작업하고 있으므로 std :: string을 사용하지 말아야한다는 제약이있다. – user987316

답변

1

나는 문자열을 이전에 &으로 유지하고 원래 문자열에 &을 대체하고 임시 배열을 원본에 추가해야한다고 생각합니다. 위의 코드가 수정되었습니다. strchr 대신 strstr을 사용하여 char *를 두 번째 인수로 사용할 수 있다고 생각합니다.

void StringSet(char * Value) 
{ 
    char *Chk = NULL,*ptr = NULL; 
    Chk = strchr(Value,'&'); 
    if(Chk != NULL) 
    { 
    ptr = Chk + 1; 
    char* p = (char*)malloc(sizeof(char) * strlen(ptr)); 
    strcpy(p,ptr); 
    Value[Chk-Value] = '\0'; 
    strcat(Value,"&amp"); 
    strcat(Value,p); 
    free(p); 
    } 
} 

감사 Niraj 라티

0

상수 문자열을 수정해서는 안되며 확실히 문자열 리터럴을 수정할 수 없습니다.

char *StringSet(const char *Value) { 
    char buffer[256]; 
    for (char *p = (char*)Value, *t = buffer; p[0] != 0; p++, t++) { 
    t[0] = p[0]; 
    if (p[0] == '&') { 
     t[1] = 'a'; t[2] = 'm'; t[3] = 'p'; 
     t += 3; 
    } 
    t[1] = 0; 
    } 
    char *t = new char[strlen(buffer)+1]; 
    strcpy(t, buffer); 
    return t; 
} 
0
string str="Current &HT"; 
str.replace(str.find('&'),1,"&amp"); 
+0

"std :: string을 사용하지 않기 위해 몇 가지 제약을 받고있는 이미 정의 된 프로그램을 작업 중" – Shoe

2

당신은 하나를 대체 할 수 없습니다 : 대신 자원 관리를 직접 처리의 std::string를 사용하는 것이 훨씬 더 나은이지만, 하나의 방법은 새로운 C 스타일의 문자열을 할당하고 그것에 대한 포인터를 반환하는 것입니다 C 스타일 문자열에 여러 문자를 추가 할 수있는 공간을 C 스타일 문자열로 알 수 없기 때문에 여러 문자가 포함 된 C 스타일 문자열의 문자를 사용할 수 있습니다. 새 문자열을 할당하고 이전 문자열을 새 문자열에 복사하면됩니다. 이 같은 것

char* StringSet(const char* value) 
{ 
    // calculate how many bytes we need 
    size_t bytes = strlen(value) + 1; 
    for (const char* p = value; *p; ++p) 
     if (*p == '&') 
      bytes += 3; 
    // allocate the new string 
    char* new_value = new char[bytes]; 
    // copy the old to the new and replace any & with &amp 
    char* q = new_value; 
    for (const char* p = value; *p; ++p) 
    { 
     *q = *p; 
     ++q; 
     if (*p == '&') 
     { 
      memcpy(q, "amp", 3); 
      q += 3; 
     } 
    } 
    *q = '\0'; 
    return new_value; 
} 

하지만 이것은 끔찍한 코드입니다. std :: string을 사용해야합니다.

+0

최종 문자열 크기를 계산하고 복사를 반복하는 모든 작업을 수행하는 경우 'value'를 매우 쉽게 수정할 수 있습니다 포스터의 코드의 의도 인 것처럼 보이는 (역방향 반복 사용) 물론 버퍼 오버런 가능성이 있습니다. +1 "당신은 정말로 std :: string을 사용해야합니다". –

+0

@TonyD 글쎄, 얼마나 많은 공간이 있는지 알지 못한다고 말했을 때, 그것은 내 포인트였습니다. 게다가이 함수를 문자열 리터럴과 함께 호출하는 문제가 있습니다. – john

+0

매우 좋은 점, 당신이 선택한 타협이 위대한 것으로 보입니다. 건배. –

관련 문제