2013-03-06 2 views
1

const.char을 해당 단어의 소문자 버전으로 변환하려고합니다. 여기에 나는 현재 내가 가지고있는 코드입니다 : 내가 가진이 코드const char * word를 소문자로 변환하는 데 도움이 필요합니다.

int i=0; 
char DuplicateArray[45]; 
int sizevalue=0; 
Node* NodePointer=NULL; 
unsigned int hashval=0; 
int counter=0; 
sizevalue=strlen (word); 

strncpy(&DuplicateArray[counter], word,sizevalue);//word is the const char pointer. 
DuplicateArray[sizevalue+1] = '\0'; 
hashval=hash(DuplicateArray);//function I call to determine hash value 
while (DuplicateArray[i] != '\0') 
{ 
    DuplicateArray[i] = tolower(DuplicateArray[i]);  
    i++; 
} 

은, 그러나, 나는 낮은 맡았다 배열의 문자를 만들 수 없습니다입니다. 누구든지 내가 뭘 잘못하고 있는지에 대한 생각이 있습니까?

+1

어떻게'DuplicateArray'가 선언 되었습니까? – cnicutar

+0

다음과 같이하십시오 : char DuplicateArray [45]; – user2014904

+1

'counter'와'i'는 어떻게 초기화됩니까? – Henrik

답변

0

인코딩이 Ascii 인 경우 이진 방식으로 수행하십시오. 차이는 비트 6에 있으며 대문자에서는 0이고 소문자에서는 1입니다. 10 진수로 32를 빼거나 6 번째 비트를 뒤집어서 쉽게 찾을 수 있습니다. 예를 들어, 문자 A는 1000001 (0x41)이고 문자 a는 1100001 (0x61)입니다.

+2

Nah, 표준 라이브러리 매크로 대신 휴대용이 아닌 하드 코딩 된 값으로 해킹 할 것을 권고하는 것은 잘못입니다. –

+0

H2CO3은 하향 투표를하고 있습니다. 누군가 그를 멈추게합니다. 하지만 사실 바이너리를 할 필요가 없으며 tolower를 할 수도 있고 단순히 범위를 확인하고 ("Z"- "A") + "a"= "z"를 사용할 수도 있습니다. – Dmitry

+1

@Dmitry 하향 투표를하다가 두 대답이 모두 잘못되었다는 것입니다. –

-1

사용

+0

예,이 예제는 전달 된 문자열을 건드리지 않는 함수이기 때문에이 예제는 악의적 인 것입니다. – Dmitry

+2

(제약 조건 위반이므로 정의되지 않은 동작이 발생하기 때문에 절대 수행하지 않아야 함). –

+0

예, 정확하게 mystr *보다 mystr []를 사용하는 이유입니다. mystr *은이 프로그램을 테스트 할 때 실제로 충돌을 일으켰습니다. 이 문제는 모두 안전하지 않습니다. 그러나 비유는 비유입니다. – Dmitry

2

내 생각 엔 당신이 오해 배열과 &[] 사업자, 또는 코드의 다른 다양한 "작은"실수 중 하나를 걸 것입니다 예를 들어이

#include <stdio.h> 
#include <ctype.h> 

void dotolower(const char *cstr) 
{ 
    char *str = (char*)cstr; 

    while (*str) { 
     *str = tolower(*str); 
     ++str; 
    }  
} 

int main() 
{ 
    char mystr[] = "HELLO"; 
    dotolower(mystr); 
    puts(mystr);  

    return 0; 
} 

(즉, UB에서의 모든 결과는 내가 말할 수있는 것처럼) 당신의 프로그램을 잘못 만든다. 이 works :

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

int main() 
{ 

    const char *word = "UpPeRcAsE"; 

    char DuplicateArray[45]; 
    int sizevalue = strlen (word); 

    strncpy(DuplicateArray, word, sizevalue);//word is the const char pointer. 
    DuplicateArray[sizevalue] = '\0'; 
    int i = 0; 
    while (DuplicateArray[i] != '\0') 
    { 
    DuplicateArray[i] = tolower(DuplicateArray[i]);  
    i++; 
    } 

    printf("Before: %s, after: %s\n", word, DuplicateArray); 

    return 0; 
} 
+0

Btw를 사용하면 코드를 올바르게 들여 쓰기하고 형식을 올바르게 지정하고 소문자 및 대소 문자 혼합 식별자를 일관되게 사용하고 문자열에 대해 더 많이 읽게됩니다. 코드는 현재 서있는 것처럼 ** 끔찍한 ** 것입니다. –

+0

ok ... thats는 알아두면 좋을 것 같다. .. 그 that 's 아마 내가 그것을 회색이게하는 원인이되고있는 thats를 똑딱 거리지 않고있는 thats는 당신의 말인가? – user2014904

+0

@ user2014904 아마도 ... 내가 설명했듯이 배열이나 문자열 또는 둘 모두에 대해 오해가있는 것 같습니다. –

관련 문제