2014-12-02 4 views
0

Я уже написал несколько вопросов о моем проекте, и все это было полезно, но я все еще не уверен в его части.Как сохранить буфер одиночных символов и распечатать их как строку?

Я создаю переводчик, который преобразует ASCII в ASH и ASH в ASCII. Теперь я успешно конвертировал ASCII в ASH, но не могу преобразовать из ASH в ASCII. Я создал функцию под названием «ASCIIstring2ASHstring», которая отлично работает, но теперь мне нужно создать еще одну функцию под названием «ASHstring2ASCIIstring». Тем не менее, мне сказали, что для этой функции мне нужно сохранить каждый символ, который пользователь вводит во временный буфер, пока не появится символ «/», после чего мне нужно распечатать все символы во временном буфере в виде полной строки вызвав функцию «ASHstring2ASCIIstring» (которую я прошу о создании помощи сейчас). Тем не менее, я понятия не имею, как это сделать, и я надеялся, что кто-то здесь может одолжить мне руку :)

Спасибо!

UPDATE: Я создал функцию с некоторой помощью, но по какой-то причине не распечатывал ASH для ASCII-переводов, как ожидалось, я опубликовал обновленный код ниже.

char ASH_a[] = "*"; 
char ASH_b[] = "!!*"; 
char ASH_c[] = "[email protected]"; 
char ASH_d[] = "*!"; 
char ASH_e[] = "!"; 
char ASH_f[] = "!*!"; 
char ASH_g[] = "**"; 
char ASH_h[] = "!**"; 
char ASH_i[] = "!!"; 
char ASH_j[] = "*!!"; 
char ASH_k[] = "*@"; 
char ASH_l[] = "!*@"; 
char ASH_m[] = "!*"; 
char ASH_n[] = "[email protected]"; 
char ASH_o[] = "@*"; 
char ASH_p[] = "[email protected]!"; 
char ASH_q[] = "*[email protected]"; 
char ASH_r[] = "[email protected]*"; 
char ASH_s[] = "@!"; 
char ASH_t[] = "@"; 
char ASH_u[] = "@@"; 
char ASH_v[] = "**!"; 
char ASH_w[] = "***"; 
char ASH_x[] = "*@!"; 
char ASH_y[] = "[email protected]@"; 
char ASH_z[] = "**@"; 
//char ASH_1[] = "@!!*"; 
//char ASH_2[] = "@[email protected]"; 
//char ASH_3[] = "@!*!"; 
//char ASH_4[] = "@!**"; 
//char ASH_5[] = "@!*@"; 
//char ASH_6[] = "@[email protected]!"; 
//char ASH_7[] = "@[email protected]*"; 
//char ASH_8[] = "@[email protected]@"; 
//char ASH_9[] = "@*!!"; 
//char ASH_0[] = "@!!!"; 
//char ASH_.[] = "@!!"; 
//char ASH_,[] = "@!*"; 
//char ASH_?[] = "@**"; 
//char ASH_![] = "@*@"; 
//char ASH_+[] = "@@!"; 
//char ASH_-[] = "@@*"; 
//char ASH_*[] = "@@@"; 
//char ASH_/[] = "@[email protected]"; 


char t[] = "ash code"; 
char buffer1[100]; 
const int oblen = 100; 
char ob [oblen]; 



void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 

    // Serial.println(ASH2ASCII("!**")); //These are the ASH characters I want to convert to ASCII using the ASH2ASCII function 
    //Serial.println(ASH2ASCII("!")); 
    //Serial.println(ASH2ASCII("!*@")); 
    //Serial.println(ASH2ASCII("!*@")); 
    //Serial.println(ASH2ASCII("@*")); 


    //ASCIIstring2ASHstring (t, ob, oblen); 
    //Serial.println(ob); 
    usinput(buffer1); 
    Serial.print(buffer1); 
    chardecide(buffer1); 

} 

void chardecide(char * buffer1) { //char decide which acts upon the result of isASH using the true and false returns 
    if (isASH (buffer1)) { 
    Serial.println(" has been recognized as ASH - "); 
    ASHstring2ASCIIstring(buffer1, ob); //passes function with buffer1 and ob included 
    Serial.println(ob); 
} else { 
    Serial.println(" has been recognized as ASCII - "); 
    ASCIIstring2ASHstring (buffer1, ob, oblen); 
    Serial.println(ob); 
    } 
} 

void usinput(char * ib) { 
    char inChar; 
    int i = 0; 
    do { 
    while (!Serial.available()) {}; 
    inChar = Serial.read(); 
    if (inChar == '\n') { 
     break; 
    } else { 
     ib[i] = inChar; 
     i++; 
    } 
    ib[i] = '\0'; 
    } while (true); 
} 


bool isASH(char * buffer1) 
{ 

    if (buffer1[0] != '*' && buffer1[0] != '!' && buffer1[0] != '@') return false; 

    return true; 

} 

int ASHstring2ASCIIstring(char *buffer, char *ob) //converts ash to ascii 
{ 
    char str[10]; 
    int j = 0; 
    int l = 0; 

    while (*buffer) { 
     if (*buffer == '/') { //hit slash 
      str[j] = '\0'; //empty buffer 
      ob[l++] = ASH2ASCII(str); 
      j = 0; 
     } else { 
      if (j + 1 < sizeof(str)) { 
       str[j++] = *buffer; 
      } 
     } 

     buffer++; 
    } 

    ob[l] = '\0'; 
    return l; 
} 

void ASCIIstring2ASHstring (char * ip, char * op, int oplen) { //converts ascii to ash 

    op[0] = '\0'; 
    int bp = 0; 
    int n; 
    char m[9]; 
    int l = strlen(ip); 
    for (int i = 0; i < l; i++) { 
    m[0] = '\0'; 
    strcpy(m, ASCII2ASH(ip[i])); 
    n = strlen(m); 
    if ((bp + n + l) < oplen) { 
     strcat(op , m); 
     bp = bp + n; 
    } 
    if (ip[i] != ' ' && ip[i + l] != ' ') { 
     op[bp] = '/'; 
     bp++; 
    } 
    op[bp] = '\0'; 
    } 
} 


char ASH2ASCII(char * m) { //Using the char variables impmented globally, ASH2ASCII searches through specific variables until it finds a match for the conversion, at which point it will capture and reuturn the ASCII string 

    if (strcmp(ASH_a, m) == 0) { //if string captured return a 
    return 'a'; 
    } 
    else if (strcmp(ASH_b, m) == 0) { //else if b string is captured return 
    return 'b'; 
    } 
    else if (strcmp(ASH_c, m) == 0) { 
    return 'c'; 
    } 
    else if (strcmp(ASH_d, m) == 0) { 
    return 'd'; 
    } 
    else if (strcmp(ASH_e, m) == 0) { 
    return 'e'; 
    } 
    else if (strcmp(ASH_f, m) == 0) { 
    return 'f'; 
    } 
    else if (strcmp(ASH_g, m) == 0) { 
    return 'g'; 

    } 
    else if (strcmp(ASH_h, m) == 0) { 
    return 'h'; 

    } 
    else if (strcmp(ASH_i, m) == 0) { 
    return 'i'; 

    } 
    else if (strcmp(ASH_j, m) == 0) { 
    return 'j'; 

    } 
    else if (strcmp(ASH_k, m) == 0) { 
    return 'k'; 

    } 
    else if (strcmp(ASH_l, m) == 0) { 
    return 'l'; 

    } 
    else if (strcmp(ASH_m, m) == 0) { 
    return 'm'; 

    } 
    else if (strcmp(ASH_n, m) == 0) { 
    return 'n'; 

    } 
    else if (strcmp(ASH_o, m) == 0) { 
    return 'o'; 

    } 
    else if (strcmp(ASH_p, m) == 0) { 
    return 'p'; 

    } 
    else if (strcmp(ASH_q, m) == 0) { 
    return 'q'; 

    } 
    else if (strcmp(ASH_r, m) == 0) { 
    return 'r'; 

    } 
    else if (strcmp(ASH_s, m) == 0) { 
    return 's'; 

    } 
    else if (strcmp(ASH_t, m) == 0) { 
    return 't'; 

    } 
    else if (strcmp(ASH_u, m) == 0) { 
    return 'u'; 

    } 
    else if (strcmp(ASH_v, m) == 0) { 
    return 'v'; 

    } 
    else if (strcmp(ASH_w, m) == 0) { 
    return 'w'; 

    } 
    else if (strcmp(ASH_x, m) == 0) { 
    return 'x'; 

    } 
    else if (strcmp(ASH_y, m) == 0) { 
    return 'y'; 

    } 
    else if (strcmp(ASH_z, m) == 0) { 
    return 'z'; 

    } 

} 

void ASCIIstring2ASH (char * buf) { 

    Serial.println(ASCII2ASH(*t)); 

} 


char * ASCII2ASH (char c) { //This is the opposire of ASH2ASCII, it uses the globally defined variables to search through ASCII characters, and returns the ASH version of that character 

    switch (c) { 

    case 'a': 
     return ASH_a;//returns ASH version of a if matched 

    case 'b': 
     return ASH_b; 

    case 'c': 
     return ASH_c; 

    case 'd': 
     return ASH_d; 

    case 'e': 
     return ASH_e; 

    case 'f': 
     return ASH_f; 

    case 'g': 
     return ASH_g; 

    case 'h': 
     return ASH_h; 

    case 'i': 
     return ASH_i; 

    case 'j': 
     return ASH_j; 

    case 'k': 
     return ASH_k; 

    case 'l': 
     return ASH_l; 

    case 'm': 
     return ASH_m; 

    case 'n': 
     return ASH_n; 

    case 'o': 
     return ASH_o; 

    case 'p': 
     return ASH_p; 

    case 'q': 
     return ASH_q; 

    case 'r': 
     return ASH_r; 

    case 's': 
     return ASH_s; 

    case 't': 
     return ASH_t; 

    case 'u': 
     return ASH_u; 

    case 'v': 
     return ASH_v; 

    case 'w': 
     return ASH_w; 

    case 'x': 
     return ASH_x; 

    case 'y': 
     return ASH_y; 

    case 'z': 
     return ASH_z; 

    case ' ': 
     return " "; 

    default: 
     Serial.println("switching went wrong!"); 
     break; 

    } 
} 



void loop() { 


} 
+0

Вам нужно сделать ASH_x массив из 26 строк, а не 26 отдельных переменных. –

+0

Вы имеете в виду в верхней части программы, где я определил все переменные char? – lrrossi

+0

Да, просто объедините все эти отдельные строки в массив, затем вы можете упростить код на порядок. –

ответ

1

В <string.h>, есть функция strtok, которая разбивает строку на ряд заданных символов. Вы можете использовать его как это:

int ASHstring2ASCIIstring(char *buffer, char *ob) 
{ 
    char *token; 
    int l = 0; 

    token = strtok(buffer, "/"); 
    while (token) { 
     println(token); 
     ob[l++] = ASH2ASCII(token); // Note: No overflow check! 
     token = strtok(NULL, "/"); 
    } 
    ob[l] = '\0'; 
    return l; 
} 

На первом вызове, вы поставляете строку для разделения, при последующих вызовах вы передаете NULL сказать strtok продолжать работать на одной и той же строке. Этот код разрушает исходную строку в процессе, потому что она помещает маркеры конца в конец токенов.

Вы также можете написать это поведение, заполнив вспомогательный буфер. Когда вы нажмете косую черту, обработайте буфер и опорожните его:

int ASHstring2ASCIIstring(char *buffer, char *ob) 
{ 
    char str[10]; 
    int j = 0; 
    int l = 0; 

    while (*buffer) { 
     if (*buffer == '/') { 
      str[j] = '\0'; 
      ob[l++] = ASH2ASCII(str); 
      j = 0; 
     } else { 
      if (j + 1 < sizeof(str)) { 
       str[j++] = *buffer; 
      } 
     } 

     buffer++; 
    } 

    ob[l] = '\0'; 
    return l; 
} 

Этот код оставляет строку неповрежденной. Это также требует, чтобы после последнего токена произошла косая черта. Возможно, это не то, что вы хотите, но это может быть хорошей отправной точкой.

+0

Спасибо! Это огромная помощь, единственное, что я не понимаю, это то, что используется для печати окончательного результата? как и в функции ASCIIstring2ASHstring, я использовал ob для печати, когда я вызывал функцию, и объявлял ее глобально. – lrrossi

+0

Эти функции заполняют строку 'ob' (без проверки ее границ, поэтому будьте осторожны). Затем вы можете напечатать эту строку так же, как и с 'ob' от другой функции. Разумеется, вы должны передать функции 'buffer1' и' ob'. –

+0

Я вызвал функцию и напечатал ее следующим образом, но ее почему-то не работает: ASHstring2ASCIIstring (buffer1, ob); Serial.println (ob); – lrrossi

Смежные вопросы