sscanf投放警告c

问题描述 投票:0回答:1

该程序的目的是获取包含数字和空格的字符串作为输入,然后使用strtok拆分该字符串并将每个数字插入数组。最后,我从数组中将数字发送到函数checkPowerOfTwo,该函数确定数字是否为2的幂,并使用计算结果打印一个字符串。

警告说: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;

}


我试图在两个sscanf行中使用强制转换为(int),但警告仍然存在。

c scanf
1个回答
0
投票

这里是从字符串中提取未知数量整数的示例。

它不使用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;
    }
}

计划会议:

在一行上输入一些数字:123456789这些数字是:num = 123num = 456num = 789在一行上输入一些数字:123a 456这些数字是:输入错误
© www.soinside.com 2019 - 2024. All rights reserved.