Sscanf Casting Предупреждение C - PullRequest
       9

Sscanf Casting Предупреждение C

0 голосов
/ 30 октября 2019

Цель программы - получить в качестве входных данных строку, содержащую числа и пробелы, затем разделить строку с помощью strtok и вставить каждое число в массив. Наконец, из массива я отправляю числа в функцию checkPowerOfTwo, которая определяет, является ли число степенью двойки, и выводит строку с вычислением.

Предупреждение гласит: passing argument 1 of 'sscanf' makes pointer from integer without a cast [-Wint-conversion]|

Предупреждение появляется в обеих строках, содержащих sscanf. Любые идеи о том, как я могу решить эти предупреждения? Мой код:

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

int checkPowerOfTwo(int x);
int main()
{
    int exp,size,*numbers,sum=0;
    char term,*str=NULL,*token;


    printf("Enter size of input:");
    if(scanf("%d%c", &size, &term) != 2 || term != '\n'){
        printf("Invalid Size\n");
        return 0;
    } if(size<=0){
        printf("Invalid size\n");
        return 0;
    } else{
        numbers=(int*)malloc(size * sizeof(int));
        str=(char*)malloc(sizeof(int)*(size+1) + (size-1)*sizeof(char));
        if(numbers==NULL||str==NULL){
            printf("Out of memory\n");
            return 0;
        } //else{
            //printf("Memory allocated\n");
        //}
        printf("Enter numbers:");
        fgets (str, sizeof(int)*(size+1) + (size-1), stdin);
        //printf("%s",str);
        token=strtok(str," ");
        while(token!=NULL){
            for(int i=0;i<size;i++){
            //printf("%s\n",token);
            numbers[i]=(int)token;
            token=strtok(NULL," ");
            }
        }
    }

    for(int j =0;j<size;j++)
    {
    exp=checkPowerOfTwo(numbers[j]);
    if (exp>=0){
        int x;
        sscanf((int)numbers[j],"%d",&x);
        printf("The number %d is a power of 2: %d=2^%d\n",x,x,exp);
        sum+=exp;
    }
    }
    printf("Total exponent sum is %d",sum);
        free(numbers);
        free(str);
}

int checkPowerOfTwo(int n)
{
   int x;
   int exponent=0;
   sscanf((int)n,"%d",&x);
   //printf("checking number %d\n",x);
   if (x==0){
        return -1;
   } if  (x==1){
      return 0;
   }
   while( x != 1)
   {
      if(x % 2 != 0){
         return -1;
      }
      x /= 2;
      exponent++;
   }
   return exponent;

}


Я пытался использовать приведение к (int) в обеих строках sscanf, но предупреждение остается.

1 Ответ

0 голосов
/ 30 октября 2019

Вот пример, который извлекает неизвестное число целых чисел из строки.

Он не использует strtok, но работает, перемещая указатель буфера за каждым успешно отсканированным элементом.

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

int main (void)
{
    char input[256];

    puts("Enter some numbers on one line:");
    if(fgets(input, sizeof input, stdin) == NULL) {
        puts("Error in input");
        exit(1);
    }

    int num;
    int len;
    char *buf = input;

    puts("The numbers are:");
    while(sscanf(buf, "%d%n", &num, &len) == 1) {
        if(!isspace(buf[len])) {
            puts("Error in input");
            exit(1);
        }
        printf("num=%d\n", num);
        buf += len;
    }
}

Программные сессии:

Enter some numbers on one line:
123 456 789
The numbers are:
num=123
num=456
num=789

Enter some numbers on one line:
123a 456
The numbers are:
Error in input
...