【问题标题】:How do i cycle through each letter in a string?如何循环遍历字符串中的每个字母?
【发布时间】:2013-01-28 22:29:21
【问题描述】:
#include <stdio.h>

int main()

#include <stdio.h>

int main()

{
    char msg[31] = {'\0'};
    char encrypted[31] = {'\0'};
    int key;


    printf("Please enter a message under 30 characters: ");
    fgets(msg, 31, stdin);

    printf("Please enter an encryption key: ");
    scanf("%d", &key);

    int i = 0;

    while (msg[i] && ('a' <= msg[i] <= 'z' || 'A' < msg[i] < 'Z'))
{
    encrypted[i] = (msg[i] + key);
    i++;
}

    printf("%s\n", msg);
    printf("%d\n", key);
    printf("%s\n", encrypted);

}

好的,我有我的代码来增加字符,但我不知道如何让它忽略特殊字符和空格。另外我如何使用% 循环回'a' 和'A'?

谢谢。

【问题讨论】:

  • 如果您的键是int,如果您将字符的值增加到超出char 类型的限制会怎样?
  • 如果一个人输入一个类似 28 的整数,而不是经过 'z',它会循环回到 'a' 并再加 2 到 'c'。
  • ASCII 不仅仅代表字母 - 注意!
  • 你在做 rot13 类型的密码?
  • 是的,它是一个 rot13 类型的密码

标签: c string ascii


【解决方案1】:
  1. 您只需要一个简单的for 循环:

    for (int i = 0; i < 31; i++)
    {
        // operate on msg[i]
    }
    

    如果您不知道开头字符串的长度,您可能更喜欢检测空终止符的while 循环:

    int i = 0;
    while (msg[i])
    {
        // operate on msg[i]
        i++;
    }
    
  2. 您的fgets 和scanf 可能没问题,但就我个人而言,在阅读输入时我会保持一致,而fgets 则适用。然后您可以sscanf 稍后获取key。

【讨论】:

  • 这也行。我认为这对于初学者来说有点不习惯。
  • 好的,我已经做到了,我已经让它增加了。但现在还有一个问题。我如何做到这一点,以便空格和特殊字符不会增加。另外,我如何让字母循环回“a”。我试过这个:while (msg[i]) { if ('a'
  • 比较运算符不会这样叠加。你需要if ((msg[i] &gt;= 'a') &amp;&amp; (msg[i] &lt;= 'z'))等等等等。
【解决方案2】:

scanf 和 fgets 在这种情况下看起来不错,就像您使用它们的方式一样。

在 C 中,字符串只是一个字符数组。因此,您可以使用 for 循环和数组索引来访问每个元素:

for (int i = 0; i < strlen(str); i++) {
  char thisChar = str[i];
  //Do the processing for each character
}

您可以根据需要对 thisChar 执行算术运算,但请注意不要超过 255。您可能需要检查 key 以确保它不会变得太大。

【讨论】:

  • 预计算 strlen 会更好,因为据我了解,strlen 是 O(n) 编辑:stackoverflow.com/questions/4132849/…
  • 公平评论,虽然我不认为速度是这里的优先事项 - 过早的优化和所有这些:)
  • 确实如此。代码可能不会很慢,但如果是,O(n^2) 将是原因......但是,n
【解决方案3】:

从 scanf 中获取字符串:

char msg[31];
scanf("%30s", msg);

OR(效率较低,因为你必须先用 0 填充数组)

char msg[31] = { 0 };
scanf("%30c", msg);

迭代字符串和 for 循环一样简单(一定要使用 c99 或 c11)

int len = strlen(msg);
for(int i = 0; i < len; i++) {
    char current = msg[i];
    //do something
    msg[i] = current;
}

“加密”(即加密)一个字符需要几个步骤

  1. 确定我们是否有大写字符、小写字符或非字母字符
  2. 确定字母表中的位置(如果是字母表)。
  3. 使用模数运算符 (%) 更新位置
  4. 更正位置(如果按字母顺序排列)

我可以在这里给你代码,但是你不会从自己做的事情中学到任何东西。相反,我鼓励您根据我上面提供的步骤来实现密码。

请注意,您可以执行以下操作:

char c = 'C';
char e = 'E' + 2; 
char lower_c = 'C' - 'A' + 'a';

【讨论】:

  • 谢谢,我有代码来增加密钥,但现在我坚持使用模数循环回 a 或 A,我也不知道如何让它不增加特殊字符和空格。我已经这样做了,但它仍然不起作用。 while (msg[i]) { if ('a'
  • 尝试将大写与小写分开处理。此外,'a' &lt;= msg[i] &lt;= 'z' 无效,但 'a' &lt;= msg[i] &amp;&amp; 'z' &gt;= msg[i] 有效。您需要分别处理大写和小写的原因是因为大写的值比小写多大约 30。
  • @NeXtMaN_786 另外,您需要获取 0-25 之间的字符,添加您的密钥,然后添加模数,然后将其返回为字符。这就是为什么你必须分别处理大写和小写 - 因为你减去不同的数字得到 0-25。
猜你喜欢
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多