2012-04-15 3 views
1

Ich habe ein String-Array von Zahlen:Überprüfen Sie, ob das gesamte Array von Zeichen in C nur Zahlen sind, und geben Sie true zurück, wenn ja?

char numbers[5][10] = { "123456789", "00", "abc5xyz", "", "987654321" }; 

ich dieses Array an eine Funktion:

for(i=0; i<5; i++) { 
    MyFNatoi(numbers[i], &value); 
    printf("array: '%s' int value: %d\n", numbers[i], value); 
    } 

In dieser Funktion, wie könnte ich überprüfen, ob der gesamte String nur Zahlen und return true wenn ja? Bisher alles was ich habe ist:

MyFNatoi(char *numArray, int *value) { 

    int i; 

    for (i = 0; i < 10; i++) { 
     if (numArray[i] > 47 && numArray[i] < 58) { 
      printf("%c", numArray[i] - 0); 
      // sscanf(p, "%d", &value); 
     } 
    } 
} 

Und das gerade zurückgibt:

123456789array: '123456789' int value: -1217188485 
00array: '00' int value: -1217188485 
5array: 'abc5xyz' int value: -1217188485 
array: '' int value: -1217188485 
987654321array: '987654321' int value: -1217188485 

Ich versuche Wert Variable zu bekommen das Äquivalent der Zeichenfolge zu sein. Wenn also die Zeichenfolge 123456789 ist, sollte value123456789 sein. Wenn es abc5xyz ist, sollte value0 sein.

es bisher wandelt nur die Zeichen auf ein 0 und kehrt :(

volle Quelle

#include <stdio.h> 

MyFNatoi(char *numArray, int *value) { 

    int i; 

    for (i = 0; i < 10; i++) { 
     if (numArray[i] > 47 && numArray[i] < 58) { 
      printf("%c", numArray[i] - 0); 
      // sscanf(p, "%d", &value); 
     } 

     // printf("%c", numArray[i]); 
    } 
// printf("- "); 
} 

int main() { 

     char numbers[5][10] = { "123456789", "00", "abc5xyz", "", "987654321" }; 
     int i, value; 

     for(i=0; i<5; i++) { 
     MyFNatoi(numbers[i], &value); 
     printf("array: '%s' int value: %d\n", numbers[i], value); 
     } 

     return 0; 
    } 

Antwort

6

Die for Schleife in MyFNatoi() sollte von der Länge der numArray eher als die Größe basieren des Arrays: Verwenden Sie strlen(numArray) und nicht 10.

Verwenden Sie isdigit() zu erkennen Wenn ein Zeichen eine Ziffer ist oder nicht.

Wenn alle Zeichen Ziffern waren, dann weisen Sie *value dem atoi() zu. Andernfalls setzen *value-0:

void MyFNatoi(char *numArray, int *value) 
{ 
    int i; 
    const int len = strlen(numArray); 

    for (i = 0; i < len; i++) 
    { 
     /* #include <ctype.h> for 'isdigit()'. */ 
     if (!isdigit(numArray[i])) break; 
    } 
    /* #include <stdlib.h> for 'atoi()'. */ 
    *value = len == i ? atoi(numArray) : 0; 
} 
2

nicht *value-0, um anzuzeigen Scheitern verurteilt Sie - 0 ist eine gültige ganze Zahl ist. Verwenden Sie stattdessen den Rückgabewert, wie Sie im Textkörper angeben. Verwenden Sie die Standardbibliothek, anstatt sich selbst zu loopen.

#include <stdio.h> 

/* return true on success */ 
int MyFNatoi(const char *numArray, int *value) 
{ 
    int n = 0; 
    return sscanf(numArray, "%d%n", value, &n) > 0 /* integer was converted */ 
     && numArray[n] == '\0'; /* all input got consumed */ 
} 
+0

Vielen Dank für Ihre Eingabe. – eveo

+0

+1 für Null ist eine gültige ganze Zahl. – hmjd

+0

@ eveo; Beachten Sie, dass Leerzeichen hier die Nummer nicht disqualifizieren. Oft was man will, aber trotzdem/gut zu wissen. Auch Zahlen> INT_MAX werden auf INT_MAX gekürzt (und nummeriert Morpfh

Verwandte Themen