我是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
}
答案 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" );