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