在C中使用紧凑指针寻址二维数组的元素[关闭]

2023-12-03

我正在使用 C 实现莫尔斯电码并遇到一些基础知识。

基本思想是我有 A 到 Z 的二维字符数组。每个数组的第一个元素是一个字母表,后跟相应的莫尔斯电码。程序将接收一个字符,一旦找到匹配项,该字符将通过整个数组进行解析,我将吐出摩尔斯电码。我可以使用简单数组操作的帮助来运行这个程序,但是我遇到了紧凑数组的问题。

该数组定义如下,

char *morseKey[37] = { 
    {"A.-"},
    {"B-..."},
    {"C-.-."},
    {"D-.."},
    {"E."},
    {"F..-."},
    {"G--."},
    {"H...."},
    {"I.."},
    {"J.---"},
    {"L.-.."},
    {"K-.-"},
    {"L.-.."},
    {"M--"},
    {"N-."},
    {"O---"},
    {"P.--."},
    {"Q--.-"},
    {"R.-."},
    {"S..."},
    {"T-"},
    {"U..-"},
    {"V...-"},
    {"W.--"},
    {"X-..-"},
    {"Y-.--"},
    {"Z--.."}
};

常规二维数组实现,

/*
    Find a match for each character from nameCode string that need to be 
    transformed to Morse Code. Once the match is found then based on the 
    Morse code flash the LED for dash and dot.
*/
for(char *cp_nameCode = &nameCode[0]; *cp_nameCode != '\0'; cp_nameCode++)
{
    charLoc = GetMorseCode(morseKey, first, last, *cp_nameCode);
    for(int col = 1; cp_morseKey[charLoc][col] != '\0'; col++)
    {
        cp_morseKey[charLoc][col] == '.' ? dot() : dash();            
    }
}

现在我的方法是声明一个指向该数组的指针,如下所示,

char **cp = morseCode;

然后借助 *cp 和 **cp 顺序访问列和行。但这不起作用。

或者,我尝试声明,

char **cp = morseCode;
char *cp_row = *morseCode;

然后访问如下,

while(*cp != '\0')
{
    while(*cp_row != '\0')
    {
        //printf("%c\n", **cp++);
        printf("%c\n", *cp_row++);
    }
    cp_row = *((++*cp));
    //cp++;
}

但代码不会超出第一行。我感觉我的指针知识还有差距。

我将不胜感激任何解决这个瓶颈的指示。


您可以使用要编码为数组中索引的字母来简化查找表。例如(未经测试,没有“防弹”或错误检查,仅适用于大写字母 A..Z):

#define NELMS(A) A/sizeof(A[0])

char *morseKeys[] = { 
    ".-",
    "-...",
    "-.-.",
    "-..",
    ".",
    "..-.",
    "--.",
    "....",
    "..",
    ".---",
    ".-..",
    "-.-",
    ".-..",
    "--",
    "-.",
    "---",
    ".--.",
    "--.-",
    ".-.",
    "...",
    "-",
    "..-",
    "...-",
    ".--",
    "-..-",
    "-.--",
    "--.."
};

char *encodeLetter(char letter) {
  return morseKeys[letter - 'A'];
}

char decodeLetter(char *code) {
  // Search array
  for (int i=0; i < NELMS(morseKeys); i++) {
    if (strcmp(morseKeys[i], code) == 0)
      return 'A' + i;
  }
  // Not found
  return 0;
}

希望这有帮助……至少有一点。

问:获得正确的莫尔斯字符串(例如“-...”)后,还需要进行哪些额外处理?从您的代码中我不清楚您还需要做什么(如果有的话)。


在上面的例子中,我试图展示:

  • 您不需要在 morseKey[] 值中包含字母(例如“A”)
  • 您不需要指定数组长度(“37”),并且
  • 您不一定需要“循环”来搜索数组。例如,“encodeLetter()”通过使用字母作为索引值来进行“直接查找”。它快得多。

要回答您的另一个问题:如果您想使用 char** 指针迭代 morseKey[] 值,您可以执行以下操作:

char *strings[] = { "AAA", "BBB", "CCC", 0 };
char **pp = strings;
while (*pp)
  printf ("value: %s\n", *pp++);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C中使用紧凑指针寻址二维数组的元素[关闭] 的相关文章

  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • 未定义条件编译符号

    我无法让 Visual Studio 按照我的预期运行 我创建了 2 个配置文件 一个定义了符号 FOO 另一个定义了符号 BAR 我有这个代码 static class MyClass if FOO public static strin
  • Boost async_write问题

    我将展示一些代码 void wh const boost system error code ec std size t bytes transferred std cout lt lt test int main int argc cha
  • 发生错误。", ExceptionMessage: "提供的 'HttpContent' 实例无效

    尝试将文件添加到 http 休息调用时出现此错误 responseJson 消息 发生错误 ExceptionMessage 提供了无效的 HttpContent 实例 它确实 正在使用 多部分 参数名称 内容 异常类型 System Ar
  • 如何在 Xamarin.Mac 中执行终端命令并读入其输出

    我们正在编写一个 Xamarin Mac 应用程序 我们需要执行像 uptime 这样的命令 并将其输出读取到应用程序中进行解析 这可以做到吗 在 Swift 和 Objective C 中都有 NTask 但我似乎无法在 C 中找到任何示
  • 无论表单上的焦点控件如何,如何捕获 Keys.F1?

    我使用了 KeyDown 事件和一些简单的代码 例如if e KeyCode Keys F1 捕获在表单上按下 F1 但如果表单上有一些文本框 或者表单上有一些带有 Dock Fill 的电子表格 则上面的代码将毫无用处并且不执行任何操作
  • gcc 中的“假设”子句

    gcc 最新版本 4 8 4 9 是否有类似于以下的 假设 子句 assume 内置icc支持吗 例如 assume n 8 0 从 gcc 4 8 2 开始 gcc 中没有 assume 的等效项 我不知道为什么 这会非常有用 马夫索建议
  • 修改公共属性的访问修饰符是否是重大更改?

    如果我将公共属性的 setter 的访问修饰符从私有更改为公共 是否会导致引用它的其他程序集发生任何重大更改 UPDATE 这个问题是我 2012 年 1 月博客的主题 https ericlippert com 2012 01 09 ev
  • #define, #ifdef #undef #endif

    我有以下代码 define PROC ADD void main void while 1 ifdef PROC ADD Do this code here then undefined it to run the code in the
  • 更新插入 MongoDB 时如何防止出现“_t”字段?

    我有一个应用程序 它使用 MongoDB 的 C 驱动程序将 Upsert 插入 MongoDB 数据库 当我打电话给Update函数 我无法指定我要更新的类型 然后 t字段插入元素的类型 这是我用来更新插入的代码 collection U
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • Julia:将数组数组转换为二维数组

    我有一个数组d包含一个浮点数组 julia gt d 99 element Array Array Float64 1 1 我正在尝试将其转换为二维数组 并且我成功地实现了我的目标 data Array Float64 length d l
  • 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?

    当我们的头文件中有原型时 我们的静态分析工具会抱怨 返回类型上有无用的类型限定符 例如 const int foo 我们这样定义它是因为该函数返回一个永远不会改变的常量 认为 API 看起来更清晰const到位 为了清楚起见 我觉得这类似于
  • 组合框由于某种原因被链接

    我有以下代码来填充 3 个组合框 private void PopulateDDLs SqlConnection connection SqlCommand command SqlDataReader reader DataTable dt
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标
  • 当另一个进程使用 std::fstream 写入文件时从文件读取[重复]

    这个问题在这里已经有答案了 我需要从文件中逐行读取 它是由 std getline 完成的 另一个进程的问题是一直向其附加数据 然后我需要读取新行 例如 文件一开始包含10行 我的程序读取了10行 那么我的程序应该等待 过了一会儿 另一个进

随机推荐