开发者社区> 问答> 正文

Windows上的linux上的分段错误

该程序的目标是扫描由数字和空格填充的字符串,并将每个数字插入数组。然后,将数组中的每个数字发送到checkPowerOfTwo函数,该函数确定所发送的数字是否为2的幂并打印计算结果。

当我在Windows上运行该程序时,一切正常。在Linux上运行会导致分段错误。

我正在使用以下命令在Linux服务器上编译代码gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG main.c -o mtm_tot。它编译成功,没有错误或警告。当我尝试运行测试仪时出现问题:./mtm_tot< test1.in > tmpout。在按此enter线之后Segmentation fault上升。

test1.in contains : 8

5 9 -1 4 20 256 -32 17 32 代码:

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

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

    printf("Enter size of input:\n");
    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("token is %s\n",token);
                //numbers[i]=token;
                sscanf(token,"%d",&numbers[i]);
                //printf("Inserting %s to the array\n ",numbers[i]);
                token=strtok(NULL," ");
            }
        }
    }

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

int checkPowerOfTwo(int x)
{
    int exponent=0;
    //sscanf(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;
}

展开
收起
祖安文状元 2020-01-08 15:23:40 535 0
1 条回答
写回答
取消 提交回答
  • 使用test1.in问题中所示的输入文件,您将大小指定为8并提供9个数字。

    您的密码

    while(token!=NULL){
                for(int i=0;i<size;i++){
                    //printf("token is %s\n",token);
                    //numbers[i]=token;
                    sscanf(token,"%d",&numbers[i]);
                    //printf("Inserting %s to the array\n ",numbers[i]);
                    token=strtok(NULL," ");
                }
            }
    
    

    将进入外while循环并在内for循环的第一次运行中处理8个数字。由于您输入了9个数字,token因此不会NULL,并且外循环将重复并再次运行内循环。这将部分覆盖数组中的数字。在第一个循环中处理完第9个数字后,token将变为NULL,在第二个循环sscanf中将尝试使用NULL指针,这可能会导致分段错误。

    您应该NULL在循环条件下结合使用计数器和检查。我也建议检查返回值,sscanf因为一个值!= 1将指示无效的输入。

    2020-01-08 15:23:51
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载