【问题标题】:sscanf casting warning csscanf 铸造警告 c
【发布时间】:2019-10-30 12:36:41
【问题描述】:

该程序的目的是获取一个包含数字和空格的字符串作为输入,然后用 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),但警告仍然存在。

【问题讨论】:

  • 语句sscanf((int)n,"%d",&amp;x); 需要一个字符串 作为它的第一个参数。该函数的行为类似于scanf,但与fscanf 一样,要扫描的 必须作为第一个参数给出。
  • 看来你的minimal reproducible example 可能要小得多。
  • 在不相关的说明中,将变量强制转换为与变量已经相同的类型是毫无意义的。
  • 你为什么要在这里使用sscanf?从整数变量中获取整数值?我对你的推理很感兴趣。
  • 对不起,我是 c 的初学者。。回忆我的想法,我完成后将编辑帖子

标签: c scanf


【解决方案1】:

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

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

计划会议:

在一行中输入一些数字: 123 456 789 数字是: 人数=123 数量=456 人数=789 在一行中输入一些数字: 123a 456 数字是: 输入错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多