[英]C - Comparing numeric strings
出於專業的好奇心,比較C中兩個完全數字字符串的最安全/最快/最有效的方法是什么?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char str1[5] = "123";
char str2[5] = "123";
char *ptr;
if(atoi(str1) == atoi(str2))
printf("Equal strings");
if(strtol(str1,&ptr,10) == strtol(str2,&ptr,10))
printf("Equal strings");
if(strcmp(str1,str2)==0)
printf("Equal strings");
return 0;
}
strcmp ()
在我看來,因為它不需要任何數字轉換。 但在這種情況下,您需要確保其中一個存儲僅包含數字字符的字符串。
你也可以在字符串上做memcmp ()
EDIT1
正如其他人所指出的前導零,你可以手動掃描前導零並通過將指針傳遞給第一個非零數字來調用strcmp ()
或memcmp ()
。
EDIT2
以下代碼說明了我想說的內容。 這僅適用於整數,不適用於浮點數。
int main (void)
{
char s1[128], s2[128];
char *p1 = s1, *p2 = s2;
/* populate s1, s2 */
while (*p1 && (*p1 == '0'))
p1++;
while (*p2 && (*p2 == '0'))
p2++;
if (strcmp (p1, p2) == 0)
printf ("\nEqual");
else
printf ("\nNot equal");
printf ("\n");
return 0;
}
對於浮點數,小數點后的尾隨零應手動切除。
或者手動完成整個過程。
EDIT4
我還想讓你看看這個浮點代碼。 這將檢測小數點前的前導零和小數后的尾隨零。 例如
對於以下代碼, 00000000000001.10000000000000
和1.1
將為Equal
int main (void)
{
char s1[128], s2[128];
char *p1, *p2, *p1b, *p2b;
printf ("\nEnter 1: ");
scanf ("%s", s1);
printf ("\nEnter 2: ");
scanf ("%s", s2);
p1 = s1;
p2 = s2;
/* used for counting backwards to trim trailing zeros
* in case of floating point
*/
p1b = s1 + strlen (s1) - 1;
p2b = s2 + strlen (s2) - 1;
/* Eliminate Leading Zeros */
while (*p1 && (*p1 == '0'))
p1++;
while (*p2 && (*p2 == '0'))
p2++;
/* Match upto decimal point */
while (((*p1 && *p2) && ((*p1 != '.') && (*p2 != '.'))) && (*p1 == *p2))
{
p1++;
p2++;
}
/* if a decimal point was found, then eliminate trailing zeros */
if ((*p1 == '.') && (*p2 == '.'))
{
/* Eliminate trailing zeros (from back) */
while (*p1b == '0')
p1b--;
while (*p2b == '0')
p2b--;
/* match string forward, only upto the remaining portion after
* discarding of the trailing zero after decimal
*/
while (((p1 != p1b) && (p2 != p2b)) && (*p1 == *p2))
{
p1++;
p2++;
}
}
/* First condition on the LHS of || will be true for decimal portion
* for float the RHS will be . If not equal then none will be equal
*/
if (((*p1 == '\0') && (*p2 == '\0')) || ((p1 == p1b) && (p2 == p2b)))
printf ("\nEqual");
else
printf ("\nNot equal");
printf ("\n");
return 0;
}
使用前需要進行一些測試。
str(n)cmp
是最快最安全的。
假設您正在尋找它們是理想的, strncmp
將是最快和最安全的,因為它可以進行直接比較而無需任何轉換。 它通常被認為比strcmp
更安全。
但是,如果您希望00
和0
相等,或者您可以稍微不同地表示相同數字的其他方式,則需要使用atoi
。
在我看來,“最安全”的方式可能是將兩個參數轉換為整數然后進行測試,因為這樣你就可以避免潛在的前導零問題。 不過,它可能不是最快或最有效的方法。
您只需使用以下內容:
if(strcmp(“123”,“123”)== 0)
{
printf("The strings are equal");
}
其他
{
printf("The strings are not equal.");
}
在我看來它應該工作。
我建議這種方式為整數:
int strcmp_for_integers(char *aa, char *bb){
char aa2[11] = "";
char bb2[11] = "";
int answer;
sprintf(aa2, "%010d", atoi(aa));
sprintf(bb2, "%010d", atoi(bb));
answer = strcmp(aa2, bb2);
return answer;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.