我有一个带字母的结构,我想把字母赋给数组所以我可以在之后使用它。如果我只是打印字母,它就有效。
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
,它会有用。但后来我得到了缓冲区溢出。
问题再次出现:如何在数组中存储字符串。
答案 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++) {