你知道要检查的字符串有多长吗?如果没有,那么您的能力有限。如果您确实知道字符串有多长,则可以加快速度。您尚未确定“*”部分必须至少为一个字符。您还没有规定是否允许使用制表符,换行符,或者......它只是字母数字(如您的示例)还是允许标点符号和其他字符?控制字符?
您知道 WORD 有多长,并且可以预先构建开始和结束标记。函数error() 报告错误(但您需要报告)并返回false。测试函数可能是bool string_is_ok(const char *string, int actstrlen);,成功返回true,出现问题返回false:
// Preset variables characterizing the search
static int wordlen = 4;
static int marklen = wordlen + 1;
static int minstrlen = 2 * marklen + 1; // Two blanks and one other character.
static char bword[] = "WORD "; // Start marker
static char eword[] = " WORD"; // End marker
static char verboten[] = " "; // Forbidden characters
bool string_is_ok(const char *string, int actstrlen)
{
if (actstrlen < minstrlen)
return error("string too short");
if (strncmp(string, bword, marklen) != 0)
return error("string does not start with WORD");
if (strcmp(string + actstrlen - marklen, eword) != 0)
return error("string does not finish with WORD");
if (strcspn(string + marklen, verboten) != actstrlen - 2 * marklen)
return error("string contains verboten characters");
return true;
}
如果您想要保证,您可能无法大幅减少测试。根据字母表中的限制,变化最大的部分是strcspn() 行。对于一小部分禁用字符来说,这相对较快;随着禁止字符数的增加,它可能会变慢。如果只允许使用字母数字,则有 62 个 OK 和 193 个不 OK 字符,除非您也将一些高位集字符计为字母。那部分可能会很慢。您可能会使用一个自定义函数做得更好,该函数采用起始位置和长度并报告所有字符是否正常。这可能是这样的:
#include <stdbool.h>
static bool ok_chars[256] = { false };
static void init_ok_chars(void)
{
const unsigned char *ok = "abcdefghijklmnopqrstuvwxyz...0123456789";
int c;
while ((c = *ok++) != 0)
ok_chars[c] = 1;
}
static bool all_chars_ok(const char *check, int numchars)
{
for (i = 0; i < numchars; i++)
if (ok_chars[check[i]] == 0)
return false;
return true;
}
然后您可以使用:
return all_chars_ok(string + marklen, actstrlen - 2 * marklen);
代替对strcspn()的调用。