0

我使用以下简单的方法来显示我的每个字母/字符NSString,并计算我NSString的字母是否少于 14 个,然后显示来自的其余字母Unichar数组中的其余字母,总共 14 个字母。

这是一个示例代码:

NSString *str = @"HELLO";

//unichar chrs [14] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // this works great, shows English chars

unichar chrs [14] ={L'б', L'в', L'г',L'д',L'ж',L'з',L'к',L'л',L'м',L'н',L'п',L'р',L'с',L'т'}; // doesnt work


for (int i = 0; i < str.length; i++) {

    int index = (arc4random() % 14);
    while (chrs[index] != 0)
    {
        index = (arc4random() % 14);
    }
    chrs[index] = [str characterAtIndex: i];
}
for (int i = 0; i < 14; i++) {
    if (chrs[i] == 0) chrs[i] = (arc4random() % 26) + 65;
}


for (int i = 0; i < 14; i++) {


    NSLog(@"%C", chrs[i]);
}

如您所见,注释行有效。但我的问题就在那里,unichar chrs包含特定的俄语字母。

我做错了什么?为什么第一个被评论的unichar chrs有效,但这个带有西里尔字母声明的字母却没有。

谢谢

4

1 回答 1

1

我认为这可以满足您的要求(但我不能 100% 确定您的目标):

NSString *str = @"HELLO";
unichar result[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// "chrs" can have any number of letters as needed
unichar chrs[14] = {L'б', L'в', L'г',L'д',L'ж',L'з',L'к',L'л',L'м',L'н',L'п',L'р',L'с',L'т'};    

int resultLen = sizeof(result) / sizeof(unichar);
int chrsLen = sizeof(chrs) / sizeof(unichar);
// Scatter the letters from "str" through "result"
for (int i = 0; i < str.length; i++) {
    int index;
    do {
        index = arc4random_uniform(resultLen);
    } while (result[index] != 0);

    result[index] = [str characterAtIndex:i];
}

// Fill in the remaining open spots in "result" with random letters from "chrs"
for (int i = 0; i < resultLen; i++) {
    if (result[i] == 0) {
        result[i] = chrs[arc4random_uniform(chrsLen)];
    }
}

for (int i = 0; i < resultLen; i++) {
    NSLog(@"%C", result[i]);
}

这个解决方案有一个缺陷。很有可能同一个字符 fromchrs可以多次使用来填充result. 如果这是一个问题,则需要更多的逻辑。

于 2013-09-02T01:18:37.807 回答