在C中逐个字符地比较两个字符串
我有一个“简单”(我希望)的问题。 我实际编码一些小程序,我需要比较两个字符串,相同的长度,但不同的字母,如
Eagle
和
Hdjoh
我想比较第一个字符串的第一个字母和第二个字符串的第一个字母,第一个字符串的第二个字母和第二个字符串的第二个字母等。
我开始这样做:
for(i=0, i<N, i++){ for(j=0, j<N, j++){ if(string1[i]==string1[j] etc.. etc.. } }
我清楚地看到它没有比较第一个字母和第一个字母,第二个字母与第二个字母等。
所以也许有人知道我该怎么做? (不使用string.h的任何函数,我想“自己做”这个’)。
也许这是一个愚蠢的问题,但我仍然是C的新手所以……
啊,最后一件事,我在我的例子中定义了5个字符的两个字符串,但它可能超过5对5 …
感谢提前的想法。
编辑1:
#include #define N 20 int main() { unsigned char string1[N], string2[N]; int Answer=0, i=0; scanf("%s", string1); scanf("%s", string2); for(i=0; i<N; i++){ if(string1[i]==string2[i]){ Answer=1; } else{ Answer=0; } } printf("Answer = %d", Answer); return 0; }
你为什么要使用嵌套的for循环呢? 如果两个字符串大小为n,请执行以下操作:
for(int i=0;i
你在i=0
,你将string1[0]
与string2[0]
进行比较,当i=1
,你将string1[1]
与string2[1]
,依此类推......
使用嵌套循环的方法没有经过深思熟虑。
显然,它会将第二个字符串的所有字母与第一个字符串的第一个字母进行比较,然后对第一个字符串的第二个字母进行相同的操作,依此类推。 完全不是所希望的行为。
重新实现strcmp()
不是很难,这是一个镜头:
int my_strcmp(const char *a, const char *b) { for(; *a && *b && *a == *b; ++a, ++b) ; if(*a < *b) return -1; return *a > *b; }
请注意,当字符串相等时,它返回零 。 编写测试的好方法是:
if(my_strmcp(a, b) == 0) { printf("two equal strings: '%s' and '%s'\n", a, b); }
有些人把它写成if(!my_strcmp())
但我不建议这样做,因为它正在捣乱这么多概念。
您希望对两个字符串使用相同的索引进行比较:
unsigned len = strlen(s1); assert(len == strlen(s2) && "Strings not the same length"); for (unsigned i = 0; i < len; i += 1) { if (s1[i] != s2[i]) return false; /* strings are not equal */ } return true; /* strings are equal */
确保字符串具有相同的编码, ASCII或UTF8等 。 比较不同编码的字符串会导致麻烦:)
此代码逐个字符地进行比较。 请注意,这不适用于加密代码,因为它容易受到定时攻击
for(i=0; i
笔记:
我假设长度相同(如所述)
我也假设字符串长度非零
在其他代码中,这两种假设可能都不正确。
简单比较每个元素,直到找到字符串的结尾或差异。
size_t i = 0; while (string1[i] != '\0' && string1[i] == string2[j]) i++; int StringTheSame = string1[i] == string2[j];
这会忽略N
,但在遇到字符串结尾( '\0'
)时会停止。
[编辑] @Kartik_Koro建议关注时间攻击。 以下是恒定时间解决方案
int diff_bits = 0; for(size_t i=0; i
如果字符串的长度比N-1短,但是根据OP的要求,上述问题就不会发生。