سؤال

من الفضول المهنية, ما هو أسلم / أسرع / الطريقة الأكثر فعالية لمقارنة سلسلتين رقمية بالكامل في ج?

#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 () على السلسلة

تحرير 1

كما أشار آخرون حول الأصفار البادئة ، يمكنك مسح يدويا من خلال الأصفار البادئة والدعوة strcmp () أو memcmp () عن طريق تمرير مؤشر إلى أول رقم غير صفري.

تحرير 2

رمز أدناه يقول ما أحاول أن أقول.هذا فقط للأعداد الصحيحة ، وليس لأرقام الفاصلة العائمة.

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;
}

بالنسبة لأرقام الفاصلة العائمة ، يجب تقطيع الأصفار الزائدة بعد الفاصلة العشرية يدويا.

أو قم بالأشياء بأكملها يدويا.

تحرير 4

وأود أيضا أن يكون لديك نظرة على هذا الرمز للنقطة العائمة.سيؤدي هذا إلى اكتشاف الأصفار البادئة قبل الأصفار العشرية والزائدة بعد العلامة العشرية.على سبيل المثال

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;
}

يحتاج إلى بعض الاختبارات قبل الاستخدام.

نصائح أخرى

يعتبر رمز الترميز العام هو الأسرع والأكثر أمانًا.

بافتراض أنك تبحث عنهم ليكونوا متطابقين ، سيكون رمز الترميز العام هو الأسرع والأكثر أمانًا لأنه يمكنه إجراء مقارنة مباشرة دون أي تحويلات.كما أنه يعتبر بشكل عام أكثر أمانًا من رمز الترميز العام.

ومع ذلك ، إذا كنت تريد أن يكون الرمز العام للرمز الترميزي العام ورمز الترقيم العام متساويين ، أو بطرق أخرى يمكنك من خلالها تمثيل نفس الرقم بشكل مختلف قليلاً ، فستحتاج إلى استخدام رمز العلامة العامة.

في رأيي ، من المحتمل أن تكون الطريقة "الأكثر أمانًا" هي تحويل كلتا الوسيطتين إلى أعداد صحيحة ثم الاختبار ، حيث ستتجنب بهذه الطريقة مشكلة الأصفار البادئة المحتملة.ربما لا تكون الطريقة الأسرع أو الأكثر فاعلية.

يمكنك ببساطة استخدام ما يلي:

إذا (strcmp ("123"، "123")== 0)

{

Genacodicetagpre

}

آخر

{

Genacodicetagpre

}

في رأيي يجب أن يعمل.

أقترح هذه الطريقة للأعداد الصحيحة: Genacodicetagpre

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top