2013-06-11 2 views
1

이 질문은 쉽고 간단해야하지만 온라인으로 검색 한 후에는 답을 찾을 수 없습니다. 질문이 너무 간단하기 때문에 수도 있습니다.
코드는 cplusplus.com입니다. 문자열을 소문자로 만드는 함수입니다. 나는 비슷한 것을하려고 의도되었다.함수에서 문자열 배열 사용 C++

/* tolower example */ 
#include <stdio.h> 
#include <ctype.h> 
int main() 
{ 
    int i=0; 
    char str[]="Test String.\n"; 
    char c; 
    while (str[i]) 
    { 
    c=str[i]; 
    putchar (tolower(c)); 
    i++; 
    } 
    return 0; 
} 

무엇을 내가 만든 것은 이것이다 :

void search(string A[], string B[], int k) 
{        
    int temp; 
    for(int j = 0; j <= 4; j++) 
    { 
     for(int i = 0; i <= k; i++) 
     { 
      string str (A[i]); 
      int h = 0; 
      char lstr[] = B[j]; 
      char c; 
      while (lstr[h]) 
      { 
       c = lstr[h]; 
       putchar (tolower(c)); 
       h++; 
      } 
      string key (B[j]); 
..... 

코드의이 부분은 for 루프입니다. B [j]는 문자열 배열입니다.
Visual Studio에서 알려 주신 내용은 입니다. char lstr [] = B [j]; 부분이 올바르지 않으면 오류 메시지는
오류 : 집계 개체에 '{...}'이 (가) 초기화됩니다.

문제는 내가 함수에서 문자열 배열을 사용하는 올바른 구문을 사용하지 않는다고 생각합니다. char 배열로 만들기 위해 B [j]에 대해해야 할 일이 있습니다. 나는 그것을 이해할 수 없었다.
포인터에 관한 것입니까? 미안 아직 포인터를 배웠습니다.

제 질문이 당신에게 의미가 있습니까? 어떤 도움을 크게 주시면 감사하겠습니다 !!

+0

B [j] 선언을 포함 할 수 있습니까? – keelar

+0

@keelar로 충분합니까? 나는 그것이 귀엽지 않다는 것을 안다. 도와 줘서 고마워! – Honeycrisp

+0

예제에서 문자열 객체를 사용하고 있으며 cpluspuls의 원래 코드는 문자 배열을 사용합니다. 당신과 함께하고 싶은 것은 어느 것입니까? – ryanbwork

답변

1

문자열의 문자를 소문자로 만들려는 경우 더 쉽게 읽을 수 있으므로 문자열로 끝까지 작업하고 std::transform을 사용하십시오.예를 들어,

// make sure to #include <algorithm> 
// at the top 
string lstr = B[j]; 
std::transform(lstr.begin(), lstr.end(), lstr.begin(), ::tolower); 

이 훨씬 더 자연스럽고 C++ 직접 char * 적은 오류가 발생하기 쉬운 작업보다 더 관용적이다.

+0

감사합니다 !!! 이 위대한 작품! – Honeycrisp

+0

도움이되었다고 생각되는 답변을 수락하거나 upvote 할 수 있습니다. – greatwolf

+0

생각 나게 해줘서 고마워! – Honeycrisp

1

charchar[]에 할당하려고합니다.

.... 
int h = 0; 
char* lstr = &B[j]; // point lstr to the address of j'th element of B. 
char c; 
while (lstr[h]) 
{ 
    c = lstr[h]; 
    putchar (tolower(c)); 
    h++; 
} 
..... 

이것이하는 일은 lstr 지금 B의 j 번째 문자를 가리키는 포인터이다 : 당신은 다음 코드를 사용하여 원하는 효과를 얻을 수 있습니다. 배열은 본질적으로 포인터입니다. B[j]을 수행하면 char ch = *(B + j);을 작성하는 것과 같습니다. 여기서 B는 문자 배열 (그렇지 않으면 string)의 첫 번째 문자 주소를 가리 킵니다. 편집 한 후

편집 는, 지금 당신이 charstd::string을 할당하려는 것으로 보인다. 다음은 수정 된 솔루션입니다. 여기

.... 
int h = 0; 
string& lstr = B[j]; // grab a reference to the j'th string in B. 
char c; 
while (lstr[h]) 
{ 
    c = lstr[h]; 
    putchar (tolower(c)); 
    h++; 
} 
..... 

는 LSTR은 기본적으로 B의 j 번째 문자열에 대한 참조이며, 당신은 당신이 i 번째 문자열의 복사본을 만듭니다 string str(A[i]);를 사용하는 방법과 같은 일반 문자열로 사용할 수 있습니다 A.

+0

B []의 정의를 본 후에도 upvote가 여전히 남아 있지만 대답은 정확하지 않습니다. – ryanbwork

+0

나는 본다. 내 대답을 편집 할게. –

1

여기서 문자 배열과 문자열 객체를 혼동스럽게합니다. 문자 배열은 설정된 크기의 바이트 배열이며 null은 종료되지만 문자열은 필요에 따라 확장/축소되고 null 종결자를 필요로하지 않습니다. 지원되지 않는 문자 배열에 문자열 객체를 지정하려고합니다. B의 배열 이름을 활용, 또한

const char* lstr = B[j].c_str() 

j의 인덱스는 재미있다 : 당신이 문자열 객체 작업, 그들의 상응하는 문자 배열을 검색 할 경우는 c_str() 함수를 사용합니다.

+0

설명해 주셔서 대단히 감사합니다 !! 그게 많이 도움이됩니다! 내가 왜 이것을 바꿀 지 모르겠다. VS는이 문장에서 _B_를 표시하고 다음을 보여주었습니다 : _Error : "const char *"유형의 값을 사용하여 "char *"유형의 엔티티를 초기화 할 수 없습니다 _ 감사합니다. – Honeycrisp

+0

사람들이 사용하는 ijk가 아닌가요? 그냥 궁금해서 – Honeycrisp

+0

죄송합니다. c_str()은 array에 대한 포인터를 반환하고 그 배열은 수정할 수 없다. c_str()의 출력을 char * (IE'(char *) B [j] .c_str()')로 변환하거나 const char *를 사용할 필요가 있습니다. – ryanbwork