gpt4 book ai didi

c - 将两个字符串合并为一个字符串,从而消除了C中的相同字母

转载 作者:行者123 更新时间:2023-11-30 15:26:29 25 4
gpt4 key购买 nike

您好我是编程新手,想向您学习一些知识:)
我正在.c中编写程序,但陷入其中。
我想获得3个或更多输入,最大5个字符的大小。 (例如:HELLO,HI,GOOD,BYE)
我想将它们堆叠在一个新字符串中,该字符串仅从这4个字符串中保留一次相同的字母
(例如:H,E,L,L,O,I,G,D,B,Y)

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

int main(void) {
char first[5], second[5], third[5], fourth[5];
printf("Enter 1st word: \n"); scanf(" %5s", &first);
printf("Enter 2nd word: \n"); scanf(" %5s", &second);
printf("Enter 3rd word: \n"); scanf(" %5s", &third);
printf("Enter 4th word: \n"); scanf(" %5s", &fourth);

char stack[21]; // i want a new string like this and then combine first 4 strings
// in this string...

return 0;
}


希望您可以让我知道我可以采用哪种方式。
(我也是该网站的新成员。我搜索了此文件,但找不到。抱歉,它存在。)

最佳答案

首先,对您的代码进行一些注释:


正如其他人在评论中已经提到的那样,您需要一个大小为n + 1的缓冲区来容纳一个n字符串。这是因为在C语言中,字符串的长度未存储在任何地方。取而代之的是,将特殊的NUL字节附加到标记其结尾的字符串上。因此,您的first,…,fourth数组的长度至少应为6。
如果发生最坏的情况并且用户输入四个不连续的单词(每个单词不超过5个字符)怎么办?然后,您的组合字符串将包含20个字符。因此,您的stack数组应能够容纳21个字符(对于终止NUL字节,还是1个字符)。 (也在user3121023的评论中提到。)
要使用scanf读取字符串,请传递类型为char *而不是char (*)[6]的参数。 first已经衰减为char *,因此请勿另外获取其地址(如&first)。打开编译器的警告(至少使用-Wall)以了解此类错误。 (在我键入此答案时,Dere0405也提到过。)
您使用scanf是不安全的。如果用户输入的字符串长于5个字符,则您将阅读数组末尾之外的内容。您可以修改格式说明符以读取%5s,以告知scanf在第5个字符之后停止读取。但是,这将在行尾保留多余的字符。更好的选择是使用fgetsgetline读取整行输入。或者,只需将字符串作为命令行参数传递(我的首选解决方案)。


现在到实际问题:

我不会为您提供完整的解决方案,而只会给您一些提示,因为这看起来很像家庭作业。 (不幸的是,其他人已经给了您完整的代码,因此您可能会忽略我的回答。)

您必须遍历所有五个字符串,并检查每个字符是否已添加到stack中。如果是这样,请继续,否则,请将其附加到stack。要遍历字符串,我们可以使用以下惯用法。

int i;
for (i = 0; first[i]; ++i)
printf("The character at position %d is '%c'\n", i, first[i]);


另外,如果我们不需要引用当前索引,则以下惯用法更为紧凑。

char * pos;
for (pos = first; *pos; ++pos)
printf("The current character is '%c'\n", *pos);


请注意,我们如何利用以下事实:作为C字符串的 first以一个NUL字节终止,该字节的值等于false。否则,我们将不知道在哪里停止迭代。

现在我们知道了如何遍历字符串的字符,如何检查是否已经添加了字符?有两种解决方案:


遍历 stack并将每个元素与当前所讨论的字符进行比较。虽然对于您的短弦,这可能是选择的方法,但是对于较长的弦,它将变得效率低下。
为每个字符创建一个计数器,并在添加到 stack时递增。您可以使用 char只是数字这一事实。因此,您可以创建一个包含256个元素(有256个不同的 char)的数组,这些元素最初都设置为0,然后增加当前添加的字符的位置。例如:

int counters[256];
memset(counters, 0, sizeof(counters)); /* fill with 0s */


然后在您的代码中:

if (counters[(unsigned char) (*pos)]++)
{
/* Character was already added. Do nothing. */
}
else
{
/* Character was not added yet. Add it to stack. */
}


if (counters[(unsigned char) (*pos)]++)有点棘手。首先, *pos引用指针 pos产生当前字符,然后将其解释为 unsigned char,因为数组不能具有负索引。然后在 counters数组中查找该位置,并在 if语句中对其求值。最终,该值通过后递增运算符递增(但仅在比较之后)。


不要忘记在 stack的末尾加上NUL字节。

关于c - 将两个字符串合并为一个字符串,从而消除了C中的相同字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27334684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com