這是我的函式代碼。我想檢查給定的兩個字串是否大小寫相同
example
String1 = PEN
String2 = PENCIL
輸出應該是相同的
example 2
String1 = PEN
String2 = pencil
輸出應為NOT SAME 這是C的程式代碼。但不確定它是否正常作業,有沒有其他方法可以像任何關鍵字一樣解決這個問題來檢查相同的情況。或任何其他方法來解決
int areSameCase(char str[],char str1[])
{
int i=0,j=0;
while(str[i]!='\0' && str1[j]!='\0')
{
if((str[i]>='a' && str[i]<='z') == (str1[j]>='a' && str1[j]<='z'))
{
return 1;
}
else if((str[i]>='A' && str[i]<='Z') == (str1[j]>='A' && str1[j]<='Z'))
{
return 1;
}
else
{
return 0;
}
i ;
j ;
}
}
uj5u.com熱心網友回復:
您可以使用isupper和islower
例子:
#include <ctype.h>
int areSameCase(const char str*, const char str1*)
{
for (int i = 0; str[i]!='\0' && str1[i]!='\0'; i)
{
int l_a = islower(str[i]);
int l_b = islower(str1[i]);
int u_a = isupper(str[i]);
int u_b = isupper(str1[i]);
if ((!l_a && l_b) || // b is lower case but a isn't
( l_a && !l_b) || // a is lower case but b isn't
(!u_a && u_b) || // b is upper case but a isn't
( u_a && !u_b)) // a is upper case but b isn't
{
return 0;
}
}
return 1;
}
uj5u.com熱心網友回復:
注意: 如果考慮可移植性,請不要撰寫這樣的代碼!
這是一種性能優于可讀性的解決方案。
bool is_same_case (const char* s1, const char* s2)
{
// CASE_MASK is a bit mask, always set in ASCII 'a' to 'z', but not in 'A' to 'Z'
const char CASE_MASK = 0x60;
const char cas = s1[0] & CASE_MASK;
for(size_t i=1; s1[i]!='\0'; i )
if((s1[i] & CASE_MASK) != cas)
return false;
for(size_t i=0; s2[i]!='\0'; i )
if((s2[i] & CASE_MASK) != cas)
return false;
return true;
}
這個代碼采取的優點'A',以'Z'在ASCII編碼具有數字0x41到0x5A和'a'到'z'具有數字0x61到0x7A。因此掩碼中的位0x6總是設定為小寫字符,而不是大寫字符。所以代碼絕對不可移植,因為它采用經典的 ASCII 編碼(......另一方面,這是非常普遍的)。
要檢查兩個字串是否具有相同大小寫的字母,則不允許任何字串從任何其他給定字母的大小寫派生。所以我們可以存盤與第一個字母對應的位組合,并將其他所有內容與它進行比較。
代碼遍歷第一個字串,根據大小寫掩碼檢查所有字母,然后對第二個字串執行相同操作。如果有什么不匹配,它會停止。
這種有點神秘的代碼的優點是性能。它不處理某些不是字母的情況,因此檢查速度比isupper/islower函式快。總而言之,在 x86_64 上檢查時大約有 40 條指令,分支數量保持在最低限度,并且一次檢查一個字串而不是比較它們,這可能有利于資料快取的使用。
完整的測驗代碼:
#include <stdio.h>
#include <stdbool.h>
bool is_same_case (const char* s1, const char* s2)
{
// CASE_MASK is a bit mask, always set in ASCII 'a' to 'z', but not in 'A' to 'Z'
const char CASE_MASK = 0x60;
const char cas = s1[0] & CASE_MASK;
for(size_t i=1; s1[i]!='\0'; i )
if((s1[i] & CASE_MASK) != cas)
return false;
for(size_t i=0; s2[i]!='\0'; i )
if((s2[i] & CASE_MASK) != cas)
return false;
return true;
}
#define TEST(s1,s2) printf("%s %s = %s\n", s1, s2, is_same_case(s1,s2)?"yes":"no")
int main (void)
{
TEST("hello","world");
TEST("Hello","World");
TEST("HELLO","WORLD");
TEST("HELLO","hello");
}
輸出:
hello world = yes
Hello World = no
HELLO WORLD = yes
HELLO hello = no
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355203.html
上一篇:通過指向陣列的指標回傳結果
