二进制转换代码分段错误

时间:2014-06-02 23:52:39

标签: c pointers binary segmentation-fault

我是C新编程的新手(只用了2周)。我无法弄清楚为什么我的代码会引发分段错误。如果我将long int num设置为静态数,我能够使程序正常工作。但是我需要程序能够从命令行接受用户输入(不是程序运行时)

实施例: ./binary 7

应该输出 7的二进制数是:111

我尝试过使用strcpy(num,argv [0]),但在编译时也会抛出错误。

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

void decToBinary(long int num)   // Function Definition
{
    long int remainder[50];
    int i=0;
    int length=0;
    printf("The binary number for %d is: ",num);
    while(num > 0)
     {
             remainder[i]=num%2;    // does the mod function
             num=num/2;             // Divides original number by 2
             i++;                   // Increases count for the upcoming for-loop
             length++;              // Increases length display digits
     }
    for(i=length-1;i>=0;i--)        // Prints out the binary number in order (ignoring the previous 0's)
    {
            printf("%ld",remainder[i]);
    }
    printf("\n");                   // Adds a new line after the binary number     (formatting)
}
//================================================================================================
int main(char argc, char* argv[])
{
    long int num;                           //HOW DO I TAKE ARGV[0] AND MAKE IT A USEABLE VARIABLE???

    printf("Enter the decimal number:  ");  //TEMPORARY until problem above is solved
    scanf("%ld",&num);                      //TEMPORARY until problem above is solved

    decToBinary(*num);                      // Calling decToBinary function
    return 0;                               // Program terminated successfully
}

3 个答案:

答案 0 :(得分:0)

提示1:如果您想在num函数中更改decToBinary()的值,则必须在其中传递其地址。所以你应该这样称呼它:

decToBinary(&num);

然后你的功能原型将如下所示:

void decToBinary(long int *num)

所以你必须正确修改功能的身体。我猜这是导致分段错误的原因。


提示2:argc代表参数计数,因此其类型不是char而是int


正如 @Kerrek SB 在他的评论中所指出的,scanf(3)是一个返回值为int的函数。检查返回值并处理可能发生的任何错误都是明智的。


argv[0]是可执行文件的名称。如果要使用命令行中的第一个参数,它将存储在argv[1]中,并且存储在char *类型中。因此,如果您想将其用作数字,则可以使用stdlib.h的{​​{3}}函数之一。

答案 1 :(得分:0)

类似的东西(不处理某些错误情况)

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

void decToBinary(long int num)   // Function Definition
{
    long int remainder[50];
    int i=0;
    int length=0;
    printf("The binary number for %ld is: ", num);
    while(num > 0)
     {
             remainder[i]=num%2;    // does the mod function
             num=num/2;             // Divides original number by 2
             i++;                   // Increases count for the upcoming for-loop
             length++;              // Increases length display digits
     }
    for(i=length-1;i>=0;i--)        // Prints out the binary number in order (ignoring the previous 0's)
    {
            printf("%ld",remainder[i]);
    }
    printf("\n");                   // Adds a new line after the binary number     (formatting)
}
//================================================================================================
int main(int argc, char* argv[])
{
    if (argc > 1)
    {
        long int mylong = atol(argv[1]);
        decToBinary(mylong);                      // Calling decToBinary function
    } else
    {
        int errno = 0;
        long int num;                           
        int res;

        printf("Enter the decimal number:  ");  //TEMPORARY until problem above is solved
        res = scanf("%ld",&num);                      //TEMPORARY until problem above is solved

        if (res != EOF)
        {
            decToBinary(num);                      // Calling decToBinary function
        } else
        if (errno != 0)
        {
            perror("scanf");
        } else
        {
            printf("No number found in input\n");
        }
    }

    return 0;                               // Program terminated successfully
}

**我在Ubuntu 14.04上建立这个**

请注意,decToBinary(* num)错误。您只能在指针上使用解引用运算符而不是int或任何非指针类型。

指针在内存中保存一个地址,当你取消引用它时,你告诉你的程序在那个地址读取。如果您取消引用例如10的int值,则告诉程序读取地址10处的值。这是一个非常低的地址值,并且将超出允许程序访问的内存范围,因此它将是一个分段错误。

首先,您必须注意编译器警告。如果适用,在构建可执行文件时使用-Werror和可能的-Wextra标志。

e.g     gcc -g -Werror -Wextra myfile.c -o myfile

如果您认真考虑C编程的基本知识,这是学习使用调试器来查找段错误的好机会。注意上面的-g标志,它将调试符号构建到您的可执行文件中(没有调试器不知道函数名称的符号)。然后,您可以使用gdb(或其他适用的调试器)并启动可执行文件,然后运行它并获取回溯跟踪以告诉您何时发生segfault。

答案 2 :(得分:0)

一种简单的方法,将argv[1]参数提取到其组成位并显示这些位......

// following eliminates any nonnumeric char from input
// by stopping at first nonnumeric char
long int value = atol(argv[1]);  
int position = sizeof( long int ) -1;

// following loop could be modified/prefixed with a loop to skip leading 0's
for( ; position >= 0; position-- )
{
    printf( "%c, ", ('0' + ( value >> position) & 1) );
}

printf( "\n" );