سؤال

أنا أحاول حل المشكلة هنا ولكن أنا لا أعرف لماذا قانون بلدي لا يعمل.أي مساعدة هي موضع تقدير.تحرير:التعديل لجعل التصحيح المذكورة أدناه ، ولكن لا يزال هناك إضافية "15" (في جريئة) في السطر الثاني من إخراج وأنا لا أفهم أين هو قادم من.

بلدي الناتج هو

18662658515 555227215

#include <stdlib.h>
#include <stdio.h>

int main(void){
  int n;
  int j;
  scanf("%d\n", &n);
  int i = 0;
  char mystr[15];

  for(;i<n;i++){
    fgets(mystr,15,stdin);

    for(j=0;j<15;j++){
      if(isdigit(mystr[j])){
        printf("%c", mystr[j]);
        continue;
      }
      if ('A' <= mystr[j] && mystr[j] <= 'C')
        printf("2");
      if ('D' <= mystr[j] && mystr[j] <= 'F')
        printf("3");
      if ('G' <= mystr[j] && mystr[j] <= 'I')
        printf("4");
      if ('J' <= mystr[j] && mystr[j] <= 'L')
        printf("5");
      if ('M' <= mystr[j] && mystr[j] <= 'O')
        printf("6");
      if ('P' <= mystr[j] && mystr[j] <= 'S')
        printf("7");
      if ('T' <= mystr[j] && mystr[j] <= 'V')
        printf("8");
      if ('W' <= mystr[j] && mystr[j] <= 'Z')
        printf("9");
    }
    printf("\n");
  }
}
هل كانت مفيدة؟

المحلول

المشكلة هي أنك بالتكرار على جميع 15 الشخصيات في سلسلة الإدخال ، بغض النظر عن طول المدخلات.أول حالة اختبار 11 حرفا ، ولكن الحالة الثانية فقط 8.في التكرار الثاني ، أنت غير قصد تجهيز آخر حرفين من الإدخال الأول ، والتي كانت 15.

إلى إصلاحه, فقط توقف عن التكرار عندما ضرب NUL حرف 0, والتي تنتهي سلسلة طريق تغيير هذا الخط

for(j=0;j<15;j++){

إلى

for(j=0; mystr[j] != 0; j++){

نصائح أخرى

لشيء واحد, أعتقد أن المقارنات إلى الوراء.على سبيل المثال ، يجب أن يكون اختبار "إذا كان ('A' <= mystr[ي] && mystr[j] <= 'C')".

سيكون من المفيد ربما أن يكون دالة بين() (مع الاعتذار;بلدي C هو صدئ):

bool between(char c, char before, char after) {
    return before <= c && c <= after;
}

لذلك

if ('A' <= mystr[j] && mystr[j] <= 'C')
        printf("2");

يصبح

if (between(mystr[j], 'A', 'C')
        printf("2");

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

نعتبر أن كنت قد ترغب في مقارنة الأشياء في نفس الترتيب.الكلام هذا في سهل الانجليزية قبل كتابة التعليمات البرمجية.إذا myLetterCode أكبر من ألف رمز && myLetterCode أقل من C. Code (يجب أن يكون ب!).

الحفاظ على الخاص بك رسالة على اليسار شيء أنت مقارنتها على اليمين.وإلا يصبح الأمر مربكا جدا سريع جدا.

لن يكون هذا أسهل مع بحث الطاولة ؟

int numbers[] = {              2, 2, 2,  3, 3, 3,
                     4, 4, 4,  5, 5, 5,  6, 6, 6,
                  7, 7, 7, 7,  8, 8, 8,  9, 9, 9, 9};

... cut ...

if (isdigit (mystr[j]))
    printf ("%c", mystr[j]);
else
    printf ("%d", numbers[mystr[j] - 'A']);

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