存储wchar_t并在显示时有时会更改某些字符

时间:2014-08-09 20:52:15

标签: c++ c windows

这可能是一个愚蠢或奇怪的问题但我在我的程序中遇到了一些奇怪的东西。这是我的完整代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

struct Word{
    private:
    wchar_t wrd[32];

    public:
        wchar_t pword[32];
        void _assign(wchar_t* sender)
        {
            memcpy(wrd, sender, sizeof(sender)+1);
            memcpy(pword, wrd, sizeof(wrd)+1);
        }

};


int main(void)
{

HANDLE ConsCL = GetStdHandle(STD_OUTPUT_HANDLE);
    printf("%s", "Dic size: ");
    int tam;
    scanf("%i", &tam);
    wchar_t* dic[tam];
    Word words[tam];

        for(int i=0; i<tam; i++)
    {
        printf("Add word %d: ",(i+1));
        dic[i] = (wchar_t*)malloc(33);
        scanf("%s", dic[i]);
        words[i]._assign(dic[i]);
    }
    system("CLS");
    printf("%s", "Succesfully stored dictionary\nBegin writting a word: \n    ");
    int cont=0;

        for(int i=0; i<tam; i++)
    {
        printf("%s\n", words[i].pword);
    }

    //wchar_t* _tword;
    char w = _getch();

    for(int i=0; i<tam; i++)
    {
        if(toupper(w)==toupper(words[i].pword[0]))
            cont++;
    }

    printf("%c\n", w);

    wchar_t* _final[cont];
    for(int i=0; i<cont; i++)
    {
        if(toupper(w)==toupper(words[i].pword[0]))
            _final[i] = words[i].pword;
    }

    //system("CLS");

    for(int i=0; i<cont; i++)
    {
        printf("%s\n", _final[i]);
    }


    /*SetConsoleTextAttribute(ConsCL, (FOREGROUND_RED | FOREGROUND_INTENSITY));
    printf("%c", w);
    SetConsoleTextAttribute(ConsCL, (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY));
    printf("%c", 'f');*/

    return 0;
}

但是当我添加一些单词时,它会改变一些值。例如,查看这些示例及其输出:

Dic Size: 5
Add word 1: perro
Add word 2: perra
Add word 3: persona
Add word 4: santuario
Add word 5: sanitario

OUTPUT:
perro
perra
persona
santuario´ //Why it show that symbol??
sanitario

所以,如果我把它像

Dic size: 1
Add word 1: santuario

OUTPUT:
santuario

或者,如果我添加了很多单词,有时会将Word大小写更改为大写,等等。是否有理由将这种情况发生在wchar_t?如果我将所有的wchar_t *更改为char *并将wchar_t更改为char [32],那么它的工作原理非常好......与wchar_t有什么关系?

1 个答案:

答案 0 :(得分:0)

你有多个问题,这里列出了一些问题:

  • _assign中,您在指针上使用sizeof,这将返回指针的大小而不是它指向的内容
  • 您使用技术上无效的variable length arrays C ++
  • 执行malloc(33)时,您分配了33个字节而不是33 wchar_t
  • printf("%s\n", words[i].pword)中,您使用的格式为"%s",用于缩小字符(即普通char)而不是wchar_t
  • printf调用一样,您使用Scanf
  • 中的窄字符输入格式
  • toupper相同,适用于char而不是wchar_t

最后,你的程序混合了(主要是)C和C ++,这只会导致问题。你必须记住,虽然C ++与C有许多相似之处(因为C是C ++的祖先),但它们仍然是两种截然不同的语言。如果你想使用C ++,那么尽可能使用。例如,使用std::wstring (or std::string for narrow character strings)而不是字符指针和数组。如果你使用the C++ standard library中的类和函数,那么你作为C ++程序员的生活将变得更加容易。