所以给定的任务是创建一个检查是否有任何字符串的函数
示例:
checkabcde(“someaxbxcxdxemm”) -> 1
checkabcde(“someOtherValue”) -> 0
checkabcde(“xyabcdeping”) -> 2
checkabcde(“someaxuxdxlxammabcde”) -> 2
在我的方法中,我已经发现子字符串是“ abcde”,但无法确定该字符串在任何情况下都包含“ a”,“ b”,“ c”,“ d”,“ e”顺序
int checkabcde(char str[]) {
char str2[] = {
'a',
'b',
'c',
'd',
'e'
};
char str3[5]; //to be filled with elements from str2 when found inconsecutive order
int i, z, x, f;
z = 0; //position for str3
f = 0; //flag for similarity comparison of str2 and str3
for (i = 0; i < strlen(str); i++) {
for (x = 0; x < strlen(str2); x++) {
if (str[i] == str2[x]) {
if ((str[i] == 'a') && (str[i + 1] == 'b') && (str[i + 2] == 'c') && (str[i + 3] == 'd') && (str[i + 4] == 'e')) {
return 2;
} else {
if (str3[z] != str[z - 1]) {
str3[z] = str2[x];
z++;
}
}
}
}
}
for (i = 0; i < 5; i++) {
for (x = 0; x < 5; x++) {
if (str2[i] == str3[x]) {
f++;
}
}
}
if (f == 5) {
return 1;
} else if (f1 == 0) {
return 0;
}
}
编辑:不允许指针
答案 0 :(得分:2)
f[256]
中的所有字符使用f[ch] = 1
集s1
,然后检查f[ch] == 1
中的每个字符是否使用s2
strstr()
参见http://man7.org/linux/man-pages/man3/strstr.3.html 以下code
可以工作:
#include <stdio.h>
#include <string.h>
int check(const char* s1, const char* s2) {
int f[256];
memset(f, 0, sizeof(f));
// check 1
for (int i = 0; s1[i] != '\0'; ++i)
f[s1[i]] = 1;
for (int i = 0; s2[i] != '\0'; ++i)
if (f[s2[i]] == 0)
return 0;
// check 2
return strstr(s1, s2) == NULL ? 1 : 2;
}
int main(void) {
printf("%d\n", check("someaxbxcxdxemm", "abcde"));
printf("%d\n", check("someOtherValue", "abcde"));
printf("%d\n", check("xyabcdeping", "abcde"));
printf("%d\n", check("someaxuxdxlxammabcde", "abcde"));
return 0;
}
答案 1 :(得分:1)
除了查找子字符串之外,您还可以使用单独的结构来检查各个字符。
可以使用五个布尔数组来存储每个字符的存在。例如:
Date State Temperature (F) Calculation
2018-10-6 AL 15 0
2018-10-7 AL 45 0
2018-10-8 AL 67 2
2018-10-9 AL 25 0
2018-10-10 AL 55 0
2018-10-11 AL 77 12
.
.
如果最后bool chars[5] = {false};
for (int i = 0; i < strlen(str); i++) {
char c = str[i];
switch(c) {
case 'a':
chars[0] = true;
break;
case 'b':
chars[1] = true;
break;
// include cases for each character you are looking for
}
}
数组中的每个条目都为true,则说明该字符串包含所有字符。
除了可以匹配子字符串,您还可以执行此操作。
您可能还想查看some other methods,以检查字符串是否包含某个子字符串。
答案 2 :(得分:1)
尝试这样的事情:
int checkabcde(char str[]) {
// Check if string contains substring "abcde"
if (strstr(str, "abcde") != NULL) {
return 2;
}
int charCounts[5] = {0, 0, 0, 0, 0};
int length = strlen(str);
int i = 0;
// Keep counts of each occurrence of a,b,c,d,e
for(; i < length; i++) {
// If "abcde" contains the current character
if (strchr("abcde", str[i]) != NULL) {
charCounts[str[i] - 'a']++;
}
}
i = 0;
// Check if any of the counts for a,b,c,d,e are 0
for (; i < 5; i++) {
if (charCounts[i] == 0) {
return 0;
}
}
// Otherwise we must have found at least 1 of each a,b,c,d,e
return 1;
}
答案 3 :(得分:0)
在str
中的每个索引处,sub
循环会查找子字符串匹配项。如果找到,则返回2。 found
循环将查看该字符str [index]是否为abcde
之一。如果是,则check
数组中的匹配索引将设置为空格。
处理完str
中的所有字符后,将abcde
与check
进行比较。如果存在匹配项,则str
中缺少该匹配字符。返回0。
#include <stdio.h>
#include <string.h>
int checkabcde ( char str[]) {
char abcde[] = "abcde";
char check[] = "abcde";
int index = 0;
int match = 1;
int length = strlen ( str);
int span = strlen ( abcde);
while ( str[index]) {
if ( str[index] == abcde[0]) {
match = 1;
for ( int sub = 0; sub < span; ++sub) {
if ( index + sub > length || str[index + sub] != abcde[sub]) {
match = 0;
break;
}
}
if ( match) {
return 2;
}
}
for ( int found = 0; index + found < length && found < span; ++found) {
if ( str[index + found] == abcde[found]) {
check[found] = ' ';
}
}
index++;
}
for ( int found = 0; found < span; ++found) {
if ( check[found] == abcde[found]) {
return 0;
}
}
return 1;
}
int main( void) {
char lines[][30] = {
"someaxbxcxdxemm"
, "someOtherValue"
, "xyabcdeping"
, "someaxuxdxlxammabcde"
, "vu4ndljeibn2c9n@aiendjba"
, "dbcaeddeaabcceabcde"
};
for ( int each = 0; each < 6; ++each) {
printf ( "for [%s] result = %d\n", lines[each], checkabcde ( lines[each]));
}
return 0;
}