c - 如何检查字符串中的重复字符

Pat*_*kyi 3 c cs50

我正在尝试创建一个程序来检查命令行参数字符串中的重复字符。该字符串假设仅包含 26 个字符,并且所有字符都必须是字母。但是,字符串中不能有任何重复的字符,每个字母字符只能出现一次。我弄清楚了程序的前两个部分,但我不知道如何检查重复的字符。我真的可以使用一些帮助和解释。

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>

int main (int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }
    else
    {
        int len = strlen(argv[1]);
        if (len != 26)
        {
            printf("Key must contain 26 characters.\n");
            return 1;
        }
        else
        {
            for (int i = 0; i < len; i++)
            {
                if (!isalpha(argv[1][i]))
                {
                    printf("Usage: ./substitution key\n");
                    return 1;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 5

以下是解决方案的基础知识:

启动时,初始化标志的表:char Seen[UCHAR_MAX+1] = {0};。在这个数组中,Seen[c]当且仅当c已经看到字符时才为真(非零)。(得到UCHAR_MAX, #include <limits.h>.)

处理每个字符时,将其复制到unsigned char: unsigned char c = argv[1][i];。然后将其转换为大写:c = toupper(c);。然后测试它是否已经被看到:

if (Seen[c])
    Report error...
Run Code Online (Sandbox Code Playgroud)

如果它是新的,请记住它已被看到:Seen[c] = 1;

这就是所有必要的。

笔记:

  • 如果已知 A 到 Z 在字符集中是连续的,就像它们在 ASCII 中一样,那么char Seen[UCHAR_MAX+1]可以简化为char Seen['Z'-'A'+1]使用Seen[c-'A']. (实际上,一个较弱的条件就足够了:A 是值中最小的大写字符,Z 是最大的。)
  • 不要试图使用unsigned char c = toupper(argv[1][i]),因为toupper是为unsigned char值定义的,并且char值可能超出范围(负数)。
  • 在 achar与 an 一样宽的深奥 C 实现中,其中int没有一个已知存在,UCHAR_MAX+1将评估为零。但是,如果发生这种情况,编译器应该发出警告。


小智 5

我假设这是来自 cs50,我现在正在解决这个问题......我所做的是我使用了一个简单的布尔函数。我使用了两个循环,第一个循环表示引用的第一个字符,在嵌套循环内,我循环遍历所有其他字符,如果 i == k,则返回 false。

bool no_repeat(string arg_letters)
{
   for (int i = 0, j = strlen(arg_letters); i < j; i++)
   {
      for (int k = i+1; k < j; k++)
      {
         if (arg_letters[i] == arg_letters[k])
         {
            return false;
         }

      }
   }
   return true;
}
Run Code Online (Sandbox Code Playgroud)


eej*_*ski 0

您可以首先对字符串中的字符进行排序,以便任何重复的字母都将彼此相邻。因此,排序后,使用保存当前扫描字符的变量扫描已排序的字符串。如果您扫描的下一个字符与上一个扫描的字符相同,则有一个重复字符

  • “字符必须按字母顺序排列。” - 你指的是什么?第一个命令行参数?还是 ASCII 表? (3认同)