كيف تحصل على موقف الشخصية في Alphabet باللغة C؟

StackOverflow https://stackoverflow.com/questions/1616706

  •  06-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة سريعة لاسترداد موقف الشخصية المعطاة في الأبجدية الإنجليزية في ج؟

شيء مثل:

int position = get_position('g');
هل كانت مفيدة؟

المحلول

int position = 'g' - 'a' + 1;

في ج ، char القيم قابلة للتحويل إلى int القيم واتخاذ قيم ASCII الخاصة بهم. في هذه الحالة، 'a' هو نفس 97 و 'g' هو 103. بما أن الأبجدية متجاورة داخل مجموعة أحرف ASCII ، وطرح 'a' من قيمتك يعطي موقفه النسبي. أضف 1 إذا كنت تفكر 'a' أن تكون أول موقف (بدلاً من Zeroth).

نصائح أخرى

سيعمل هذا مع EBCDIC وهو حساس للحالة:

#include <ctype.h>
#include <stdio.h>
#include <string.h>

int getpos (char c)
{
    int pos;
    const char * alphabet = "abcdefghijklmnopqrstuvwxyz";
    const char * found;

    c = tolower ((unsigned char)c);
    found = strchr (alphabet, c);
    pos = found - alphabet;
    if (!found)
        pos = 0;
    else if (pos == 26)
        pos = 0;
    else
        pos++;
    return pos;
}

int main ()
{
    char tests[] = {'A', '%', 'a', 'z', 'M', 0};
    char * c;
    for (c = tests; *c; c++) {
        printf ("%d\n", *c - 'a' + 1);
        printf ("%d\n", getpos (*c));
    }
    return 0;
}

نرى http://codepad.org/5u5uo5zr إذا كنت تريد تشغيله.

يجب أن تأخذ في الاعتبار الحالة العلوية/السفلية. غالبًا ما يكون في غالباً ما يكون في غالباً ما يكون خطيرة لأنه يمكن أن يؤدي إلى حشرات خارج عن الحشرات. كقاعدة عامة ، أقوم دائمًا بتحويل فهرس يعتمد على 1 فقط عند التفاعل مع المستخدم ، واستخدم العد على أساس 0 داخليًا ، لتجنب الالتباس.

int GetPosition(char c)
{
   if (c >= 'a' && c <= 'z') {
      return c - 'a';
   }
   else if (c >= 'A' && c <= 'Z') {
      return c - 'A';
   }
   else  {
      // Indicate that it isn't a letter.
      return -1;
   }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top