char String1 = "1234567890+-";
char String2 = "1+a";
String2 является входом, и я хочу проверить, содержит ли он какой-либо символ, которого нет в String1.
Я пытался использовать strpbrk(String2,String1)
, но это возвращает true, если какой-либо символ в String1
существует в String2
.
Есть ли лучший способ сделать это?
for(char *c=str2; *c; c++) if (strchr(str1,*c)==0) {printf("error: %c",*c); break;} if (!*c) printf("ok");
strspn
вернет индекс первого символа в String2, которого нет в String1. Если все символы совпадают, индекс будет равен завершающемуся нулю.
#include <stdio.h>
#include <string.h>
int main ( void) {
char *String1 = "1234567890+-";
char *String2 = "1+a";
int index = strspn ( String2, String1);
if ( String2[index]) {
printf ( "character \'%c\' not found in %s\n", String2[index], String1);
}
return 0;
}
Вы можете использовать упрощенную версию union-find
.
Сначала вы перебираете string1
и отмечаете все символы 1
. Я пишу упрощенный код, вы можете его дополнить.
char mark[255];
for(s=string1; s; s++) mark[*s]=1;
Затем вы перебираете string2
и проверяете, отмечен ли текущий символ.
for(s=string2; s; s++) if (!mark[*s]) printf("%c", *s);
Это напечатает все символы из string2
, которых нет в string1
.
Вы забыли инициализировать mark
(не UB, но потенциально неправильный результат) и преобразовать *s
в unsigned char
для индексации (потенциальный UB).
Как насчет
strcspn
?