या दो दृष्टिकोणों का एक संयोजन:
_Bool starts_with(const char *restrict string, const char *restrict prefix)
{
char * const restrict prefix_end = prefix + 13;
while (1)
{
if ( 0 == *prefix )
return 1;
if ( *prefix++ != *string++)
return 0;
if ( prefix_end <= prefix )
return 0 == strncmp(prefix, string, strlen(prefix));
}
}
EDIT: नीचे दिया गया कोड काम नहीं करता है क्योंकि यदि strncmp 0 देता है तो यह ज्ञात नहीं होता है कि एक समाप्ति 0 या लंबाई (block_size) तक पहुँच गई थी या नहीं।
एक अतिरिक्त विचार ब्लॉक-वार की तुलना करना है। यदि ब्लॉक समान नहीं है तो मूल फ़ंक्शन के साथ उस ब्लॉक की तुलना करें:
_Bool starts_with_big(const char *restrict string, const char *restrict prefix)
{
size_t block_size = 64;
while (1)
{
if ( 0 != strncmp( string, prefix, block_size ) )
return starts_with( string, prefix);
string += block_size;
prefix += block_size;
if ( block_size < 4096 )
block_size *= 2;
}
}
स्थिरांक 13
, 64
, 4096
, साथ ही की घातांक block_size
सिर्फ अनुमान है। इसे इस्तेमाल किए गए इनपुट डेटा और हार्डवेयर के लिए चुनना होगा।