прочтите argv [1] в "key", используя atoi. Следует принимать только int. Если введено не int, например 3g, как мне отклонить это как non int - PullRequest
0 голосов
/ 03 августа 2020

Как мне это исправить. Моя программа не должна принимать какой-либо алфавит.

Int должен принимать только действительные числа и отклонять строку, если она содержит алфавит

int main(int argc, char *argv[])
{
    char str[1000];
    int i, ch, key;
    {
        if (argc != 2)
        {
             printf("key\n");
             return 1; // exit prog
        }
        // read argv value into key after argc valid
        //to prevent sementation error
        key = atoi(argv[1]);
        // do multi wrap arounds use leftover digit
        key = (key % 26);
            //check for positive number
        if (key < 1)
        {
        printf("key\n");
        return 1; // exit prog
        }
        // ask for text if pos number
        else if (key >= 0)
        {
        printf("text:");
        // check string and read in
        fgets(str, sizeof str, stdin);
        i = strlen(str);
}

Если я набираю

  • ./name (без ввода, алфавит, две строки возвращают 1, как должно.)
  • . / name (число должно работать и возвращать 0)
  • . / name a1 или b5 возвращают 1, но 1a или 5b возвращают 0 и не должны.

В отладчике я вижу, что он только считывает значение числа в argv как 1 или 5, а не как 1a или 5b

Ответы [ 3 ]

1 голос
/ 03 августа 2020

Вместо функции atoi используйте другую стандартную функцию strtol. Например,

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

int main(void) 
{
    const char *s1 = "3g";
    const char *s2 = "32";
    
    char *endptr;

    errno = 0;
    
    long key = strtol( s1, &endptr, 10 );
    if ( *endptr != '\0' || errno != 0 )
    {
        puts( "invalid value supplied" );
    }
    else
    {
        printf( "key = %ld\n", key );
        
    }

    endptr = NULL;
    errno = 0;
    
    key = strtol( s2, &endptr, 10 );
    if ( *endptr != '\0' || errno != 0 )
    {
        puts( "invalid value supplied" );
    }
    else
    {
        printf( "key = %ld\n", key );
        
    }
    
    return 0;
}

Вывод программы:

invalid value supplied
key = 32
0 голосов
/ 04 августа 2020
   //I did not want to rewrite my code from start so: I added the following into my 
   //code just before the "key = atoi(argv[1]);" line

                                                                 
     else if(strspn(argv[1], "0123456789") == strlen(argv[1]))
     {
     }   
     else if(strspn(argv[1], "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./") == strlen(argv[1]))
    {  printf("key\n");
        return 1; }     
0 голосов
/ 03 августа 2020

Вы можете использовать strtol() для преобразования строк в целые числа и получения последней позиции преобразованной строки.

#include <limits.h>
#include <stdlib.h>
#include <errno.h>

// ...

int key;
// ...
char* end;
long key_temp;
// ...
errno = 0;
key_temp = strtol(argv[1], &end, 10);
if (argv[1][0] == '\0') {
    // no character exists
} else if (*end != '\0') {
    // invalid character exists
} else if ((errno == ERANGE && (key_temp == LONG_MIN || key_temp == LONG_MAX)) ||
key_temp < INT_MIN || INT_MAX < key_temp) {
    // too small or too big
} else if (key_temp == 0 && errno != 0) {
    // other error
} else {
    // looks OK
    key = (int)key_temp;
}
...