我正在尝试创建一个程序来检查命令行参数字符串中的重复字符。该字符串假设仅包含 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)
以下是解决方案的基础知识:
启动时,初始化标志的表: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;。
这就是所有必要的。
笔记:
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值可能超出范围(负数)。char与 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)
您可以首先对字符串中的字符进行排序,以便任何重复的字母都将彼此相邻。因此,排序后,使用保存当前扫描字符的变量扫描已排序的字符串。如果您扫描的下一个字符与上一个扫描的字符相同,则有一个重复字符