Это код, который я придумал, но иногда он не работает.
Например, если строка1 = дорога в ад, а строка2 = лестница в рай, вывод будет «ghll», несмотря на то, что «h» находится во второй строке, а также в первой строке. Я не могу понять, почему h не удаляется, как другие символы в обеих строках.
#include <stdio.h>
#include <string.h>
main()
{
char string1[30], string2[30];
int length1, length2;
printf("Enter string 1: ");
gets(string1);
printf("Enter string 2: ");
gets(string2);
length1 = strlen(string1);
length2 = strlen(string2);
for (int i = 0; i <= length1; i++)
{
for (int j = 0; j <= length2; j++)
{
if (string1[j] == string2[i])
{
for (int k = j; k <= length1; k++)
{
string1[k] = string1[k + 1];
}
}
}
}
printf("Deleted characters of string 2 from string 1: %s", string1);
}
i <= length1
должно быть i < length1
Вы можете прочитать это: Почему функция gets настолько опасна, что ее нельзя использовать?
Если одна строка содержит символ верхнего регистра H
, следует ли отфильтровывать соответствующий символ нижнего регистра h
из другой строки?
#include <stdio.h>
#include <string.h>
int main() {
char s1[] = "highway to hell";
char s2[] = "stairway to heaven";
printf ("S1: %s\nS2: %s\n", s1, s2);
char alt[256] = {0};
//build a lookup table for efficient filtering
for (int ci = 0; s2[ci]; )
alt[(unsigned char)s2[ci++]] = 1;
int slen = 0;
for (int ci = 0; s1[ci]; ++ci) {
if (alt[(unsigned char)s1[ci]]) continue;
s1[slen++] = s1[ci];
}
s1[slen] = '\0';
printf ("S1 after S2 filter : %s\n", s1);
return 0;
}
gets()
устарело, используйте вместо него fgets()
.
fgets()
: если читается новая строка (\n
), она сохраняется в буфере. Обрезать буфер перед использованием: Удаление завершающего символа новой строки из ввода fgets()
int s1len = strlen (s1); int s2len = strlen (s2);
не нужен. Возможно, вместо этого for (int ci = 0; ci < s2len; )
--> for (int ci = 0; s2[ci]; )
.
gets()
это плохо. Вместо этого используйтеfgets()
.