将文本保存在char数组中的结构中

时间:2017-05-03 08:33:50

标签: c arrays string struct

我有一个带字母的结构,我想把字母赋给数组所以我可以在之后使用它。如果我只是打印字母,它就有效。

Top(struct):

 #include "stdafx.h"

typedef struct { char* code; char* letter;}morse_tabelle; 

morse_tabelle tabelle[] = {
    { ".-", "A" },
    { "-...", "B" },
    { " -.-. ", "C" },
    { "-..", "D" },
    { ".", "E" },
    { "..-.", "F" },
    { "--.", "G" },
    { "....", "H" },
    { "..", "I" },
    { ".---", "J" },
    { "-.-", "K" },
    { ".-..", "L" },
    { "--", "M" },
    { "-.", "N" },
    { "---", "O" },
    { ".--.", "P" },
    { "--.-", "Q" },
    { ".-.", "R" },
    { "...", "S" },
    { "-", "T" },
    { "..-", "U" },
    { "...-", "V" },
    { ".--", "W" },
    { "-..-", "X" },
    { "-.--", "Y" },
    { "--..", "Z" },
    { "-----", "0" },
    { ".----", "1" },
    { "..---", "2" },
    { "...--", "3" },
    { "....-", "4" },
    { ".....", "5" },
    { "-....", "6" },
    { "--...", "7" },
    { "---..", "8" },
    {"----.", "9" },
    { "/", " " },
    };

对于arraysize:

#define ARR_SIZE(x) (sizeof(x)/sizeof((x)[0]))

功能:

    void morse_to_text(void)
    {


    char input[100];
    char* morse_letter;

    int j = 0;
    char* translation[50];


    printf_s("\n\nput in Morsecode:\n\n");
    fgets(input, 100, stdin);                                             
    input[strlen(input)-1] = '\0';                                       

    morse_letter = strtok(input, " ");                               

    while (morse_letter)                                                      
    {
        for (int i = 0; i < ARR_SIZE(tabelle); i++)                            
        {

            if (!strcmp(morse_letter, tabelle[i].code))                  
            {
                translation[j] = tabelle[i].letter;                    
                j++;
                /*printf_s("%s", tabelle[i].letter);*/   //This works              
            }
        }
        morse_letter = strtok(NULL, " ");                            
    }

    /*output*/
    printf_s("\n\n---------------\n\n");
    for (int i = 0; i <= strlen(translation[50]); i++){
            printf("%s", translation[i]);
    }

};

如果我将结构内部的char* letter更改为char letter,它会有用。但后来我得到了缓冲区溢出。 问题再次出现:如何在数组中存储字符串。

3 个答案:

答案 0 :(得分:3)

你真正想要的是:

char translation[50]; // no string array, char array!

然后将字母作为您想要的字母:

typedef struct { char* code; char letter;} morse_tabelle;

有了这个,你现在可以简单地做到

translation[j] = tabelle[i].letter;
再次,就像以前一样。只有数据类型发生了变化......

但是,您需要对已翻译的字符串进行空终止,否则您无法将其与printf("%s", translation)一起使用

while(...) { ... }
translation[j] = 0;

// output:
// no for loop any more!

printf("%s", translation);

终止空字符的替代方法是给printf格式参数提供长度:

while(...) { ... }
// no termination any more...

// output:
// no for loop any more!

printf("%.*s", j, translation);

有关详细信息,请参阅printf(好的,链接实际上是C ++,但文档对C来说也是如此)。

答案 1 :(得分:1)

而不是:

translation[j] = tabelle[i].letter;

做的:

translation[j] = tabelle[i].letter[0];

或者更确切地说,做:

typedef struct { char* code; char letter;} morse_tabelle; 

morse_tabelle tabelle[] = {
    { ".-", 'A' },
    { "-...", 'B' },
    { " -.-. ", 'C' },
    { "-..", 'D' },
    etc. etc.

char translation[50];
...
printf("%s\n", translation);

或者,如果您想逐字打印翻译件:

for (int i = 0; i < strlen(translation); i++)
{
    printf("%c\n", translation[i]);
}

添加一些基本的C学费:

char *是指向char类型数组的指针。 "A"是一个包含两个元素的char数组,可以写为{ 'A', '\0' }。因此,将"A"分配给char类型是错误的。

如果将letter定义为char *并使用一个字符串填充数据,则可以通过将第0个元素索引为letter[0]来访问该字符。但是,不是在整个空间中使用字符数组而浪费内存并使代码过于复杂,最好只使用字符。

答案 2 :(得分:0)

下面:

for (int i = 0; i <= strlen(translation[50]); i++) {

strlen(translation[50]错了。 translation是一个包含指向char*的50个指针的数组。所以strlen(translation[50])是第50个翻译字符的长度(如果输入了50个莫尔斯代码,则仅存在BTW),而不是您放入translation数组的元素数量。您已将j char*指针放入translation数组,因此正确的代码为:

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