1

aa const.char をその単語の小文字バージョンに変換しようとしています。これが私が現在持っているコードです:

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++;
}

ただし、このコードでは、配列内の文字を小文字にすることはできません。誰かが私が間違っていることについて何か考えがありますか?

4

3 に答える 3

2

私の推測では、あなたは配列と&and[]演算子を誤解しているか、コード内の他のさまざまな「小さな」間違い(私が知る限りすべてUBになります)がプログラムの誤動作を引き起こしていると思います。これは動作します:

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

int main()
{
    const char* uppercase = "UpPeRcAsE";

    char duplicateArray[45];
    int uppercaseSize = strlen(uppercase);

    // copy uppercase into duplicateArray
    strncpy(duplicateArray, uppercase, uppercaseSize);

    duplicateArray[uppercaseSize] = '\0';
    int i = 0;
    while (duplicateArray[i] != '\0')
    {
        duplicateArray[i] = tolower(duplicateArray[i]);    
        i++;
    }

    printf("Before: %s, after: %s\n", uppercase, duplicateArray);

    return 0;
}
于 2013-03-06T07:39:16.583 に答える
0

エンコーディングがASCIIの場合は、バイナリで行います。違いはビット6にあり、大文字では0、小文字では1です。10進数で32を引くか、6番目のビットを反転するだけで簡単に見つけることができます。たとえば、文字Aは1000001(0x41)で、文字aは1100001(0x61)です。

于 2013-03-06T07:31:19.680 に答える
-1

これを使って

#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;
}

例として

于 2013-03-06T07:34:35.960 に答える