2013-03-28 6 views
1

Хорошо, я беру класс C++ и пытаюсь создать консольную программу, которую пользователь вводит своим именем, а затем программа выводит новое имя на основе каждой буквы имя пользователя.Преобразование имени в числа, затем генерация вывода

Я пытаюсь сделать это со строкой, но еще не знаю, как правильно преобразовать строку и int для каждой буквы.

Единственное, что у меня есть в этой программе - это строка замены для каждого символа, но google и stackoverflow не показали ничего, что я могу применить к моей текущей ситуации. Вот моя строка:

string ninjaName[28] = {"ka", "zu", "mi", "te", "ku", "lu","ji", 
    "ri", "ki", "zu", "me", "ta", "rin", "to", "mo", "no","no", 
    "ke", "shi", "ari", "chi", "do", "ru", "mei", "na", "fu", "zi"}; 

Строка представляет 28 букв в алфавите и базируется на «Ниндзя название» картины.

Я ценю помощь заранее!

+1

28 букв в алфавите? Каковы 2 дополнения? – talnicolas

+0

@talnicolas, я скажу кана. – chris

+0

@talnicolas Названия не похожи на имена латинского алфавита. (В этом отношении латинский язык использовал только 21 символ, где, поскольку современный шведский язык имеет 29. Даже в латинском алфавите число символов меняется.) –

ответ

0

Из того, что я мог понять, что вы пытаетесь использовать код ASCII от каждого символа пользователя и замените его на другую строку.

Есть два способа я бы лично это сделать:

  1. Я бы поддерживать массив, что у вас есть там. Для каждого символа на входе пользователя я бы проверил, будет ли он либо строчным, либо строчным символом, если это так, я бы индексировал массив ninjaName относительно таблицы ASCII.

Пример:

#include <ctype.h> 
#include <iostream> 
#include <string> 

std::string ninjaName[28] = {"ka", "zu", "mi", "te", "ku", "lu","ji", 
    "ri", "ki", "zu", "me", "ta", "rin", "to", "mo", "no","no", 
    "ke", "shi", "ari", "chi", "do", "ru", "mei", "na", "fu", "zi"}; 

int main(void) 
{ 
    std::string input, newName; 
    std::getline(std::cin,input); 
    newName = ""; 
    char c; 

    for(unsigned int i=0; i < input.length(); ++i) 
    { 
     c = input[i]; 
     if (!isalpha(c)) 
      newName += c; 
     else 
      newName += ninjaName[tolower(c) - 'a'];  
    } 

    std::cout << "Generated name: " << newName << std::endl; 
    std::cin.get(); 

    return 0; 
} 

Google таблицы ASCII.

Другое решение будет состоять из использования std :: map, но как с точки зрения производительности, так и с точки зрения простоты, решение выше было бы лучше.

+0

С другой стороны, предлагаемое решение предполагает ASCII. Это очень вероятно, но есть еще машины, которые используют другие кодировки. –

+0

Мой плохой просчет, я просто выплюнул это, поэтому у меня будет код ссылки, чтобы добавить с моим вопросом. перечислены 27 «ниндзя» персонажей, двое из которых «нет». я все время получал ошибку, когда у меня было 26, и мне просто не хотелось тратить время на исправление этого вопроса. В будущем я обязательно успокою троллей. : D Благодарим за помощь Рубен Кордейру. –

+0

Мне придется исследовать большую часть этого, чтобы понять, что он делает! Он выводит правильное имя после проверки. –

0
#include<iostream> 
#include <string> 
using namespace std; 
string ninjaName[28] = {"ka", "zu", "mi", "te", "ku", "lu","ji", 
"ri", "ki", "zu", "me", "ta", "rin", "to", "mo", "no","no", 
"ke", "shi", "ari", "chi", "do", "ru", "mei", "na", "fu", "zi"}; 

int main() 
{ 
    string name,outstr; 
    int cindex=0; 

    cout << "Enter Your Name:\t"; 
    cin >> name; 
    size_t sz = name.size(); 
    for (int i = 0; i < sz; i++) 
    { 
     if(!isalpha(name[i])) 
     { 
      outstr+=name[i]; 
      continue; 
     } 
     cindex = tolower(name[i])-'a'; 
     outstr.append(ninjaName[cindex]); 
    } 
    cout << "\nyour new Ninja Name is:\t" <<outstr << "\n"; 
    return 0; 
} 

То главным образом в C, а не C++, но он делает то, что я думаю, что вы ищете.
строка представляет собой массив символов, символ - это просто число.

Редактировать
обновил код на C++, в свою очередь, фиксирующие проблемы, как отметил Джеймс Kanze

+0

Также может произойти сбой (например, если пользователь вводит имя более 64 символов). (И это действительно плохая практика, чтобы называть 'strlen' каждый раз в цикле.) –

+0

@JamesKanze Вы совершенно правы по обоим пунктам, я сбил это с головы, не проверил, спасибо. Я отредактирую его, чтобы исправить эти 2 очка. – Daboyzuk