سؤال

في كلية سئلت عما إذا كان برنامجنا يكتشف ما إذا كانت السلسلة تدخل من وسيطات سطر الأوامر هي عدد صحيح لم يكن عليه (./Program 3.7). الآن أتساءل كيف يمكنني اكتشاف هذا. حتى المدخلات كما على سبيل المثال a غير صالح الذي يكتشف Atoi، ولكن الإدخال مثل على سبيل المثال 3.6 يجب أن تكون غير صالحة ولكن ATOI ستحويل هذا إلى عدد صحيح.

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        int number = atoi(argv[1]);
        printf("okay\n");
    }
}

ولكن لا ينبغي طباعة الأفكار بخير فقط إذا كان Argv [1] بالفعل عددا صحيحا. آمل أن يكون سؤالي واضح. تشكرات.

هل كانت مفيدة؟

المحلول

القي نظرة على strtol..

إذا لم يكن Endptr NULL، Strtol () يخزن عنوان الحرف الأول غير صالح في * Endptr. إذا لم تكن هناك أرقام على الإطلاق، فإن Strtol () يخزن القيمة الأصلية للنتر في * Endptr. (وهكذا، إذا * str ليس كذلك \0' but **endptr is0 "في المقابل، كانت السلسلة بأكملها صالحة.)

#include <stdio.h>

int main(int argc, char *argv[]) {
  if (argc > 1) {
    char* end;
    long number = strtol(argv[1], &end, 0);
    if (*end == '\0')
      printf("okay\n");
  }
}

نصائح أخرى

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

  • علامة اختيارية، +/-.
  • رقم مطلوب.
  • أي عدد من الأرقام الاختيارية (ولكن احترس من تجاوز الفائض).
  • نهاية السلسلة.

من تلك المواصفات، يمكنك كتابة وظيفة ستقوم بالعمل من أجلك.

شيء مثل هذا الرمز الزائدي سيكون بداية جيدة:

set sign to +1.
set gotdigit to false.
set accumulator to 0.
set index to 0.
if char[index] is '+':
    set index to index + 1.
else:
    if char[index] is '-':
        set sign to -1.
        set index to index + 1.
while char[index] not end-of-string:
    if char[index] not numeric:
        return error.
    set accumulator to accumulator * 10 + numeric value of char[index].
    catch overflow here and return error.
    set index to index + 1.
    set gotdigit to true.
if not gotdigit:
    return error.
return sign * accumulator.
int okay = argc>1 && *argv[1];
char* p = argv[1];
int sign = 1;
int value = 0;
if( *p=='-' ) p++, sign=-1;
else if( *p=='+' ) p++;
for( ; *p; p++ ) {
    if( *p>='0' && *p<='9' ) {
        value = 10*value + *p-'0';
    } else {
        okay = 0;
        break;
    }
}
if( okay ) {
    value *= sign;
    printf( "okay, value=%d\n", value );
}

تحرير: السماح - و + أحرف

قد تقوم حتى بضغط هذا في بطانة واحدة أو اثنين. أو قد تجد وظيفة مكتبة بنفس الوظيفة؛)

Edit2: فقط للمتعة - يجب أن تحليل الرقم الآن

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