【问题标题】:Manipulating array of chars操作字符数组
【发布时间】:2015-05-03 09:04:57
【问题描述】:

我正在用 C 编程语言编写一个代码,它接收一个字符串(字符)作为输入,每个字母在字母表中前进 3。例如。如果用户键入“abc”,程序应该返回“def”。问题是,如果用户键入“z”(例如),程序会返回一些字符,而不是我的目标(在这种情况下是字母“c”)。我当前的算法包括这个 if 语句:

if ((text[i]>='a' && text[i]<='w')||(text[i]>='A' && text[i]<='W'))
                  text[i] = (text[i]) + 3;

但这迫使我写下所有这些行:

       else if (text[i]=='x') text[i]='a';
            else if (text[i]=='X') text[i]='A';
                 else if (text[i]=='y') text[i]='b';
                      else if (text[i]=='Y') text[i]='B';
                           else if (text[i]=='z') text[i]='c';
                                else if (text[i]=='Z') text[i]='C';

如何优化我的代码?

【问题讨论】:

  • 听起来你需要%(模数/余数)。
  • @JoachimPileborg,问题是当程序尝试转换一些 x、y 或 z 时,他返回下一个 ASCII 码的下一个字符,而不是像我希望的那样从字母表重新开始...这意味着如果我输入 z 他可能会返回一些标点符号或其他符号...
  • @EOF ,我该如何使用 % ?
  • 对于大写 ASCII:newchar = 'A'+((oldchar-'A'+offset)%(number_of_capital_chars));offset 在你的情况下是 3。
  • 或一对加倍的字母数组,如果出于某种原因您不喜欢模运算符。除了一堆单值 if-else-if 之外,还有很多方法可以做到这一点。

标签: c arrays


【解决方案1】:

您的问题可以用简单的算术逻辑来解决。 char 的范围是 0 - 255。每个值对应一个单独的字符。字母“A-Z”和“a-z”的范围分别为 65 - 90 和 97 - 122。因此,对于您的问题,有两个范围。您可以使用标准库函数检查您的字符是否在大写或小写范围内。然后你可以为你的范围设置基础。接下来你会找到你的角色相对于基础的偏移量,在其中添加 3。可以使用 % 运算符使新值循环。每个范围最多有 26 个字符,因此您可以通过从 26 获取一个 mod 来使您的范围循环。现在将结果值(偏移量)添加到基数以获得所需的字符。

#include <ctype.h>
...
...
...

char c = text[i];
char base = isupper(c)? 'A' : 'a';
text[i] = base + (((c - base) + 3) % 26);    // New Desired Character

【讨论】:

  • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。 (该帖子至少被一位用户标记,大概是因为他们认为应该删除没有解释的答案。)
猜你喜欢
  • 2015-01-19
  • 2012-03-25
  • 2011-03-22
  • 2017-12-05
  • 2020-09-04
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多