2016-04-21 8 views
-2

У меня была эта работа второй раз, но случайно ее сломала. Может ли кто-нибудь помочь мне исправить это? У меня возникает ошибка сегментации, поэтому я предполагаю, что в какой-то момент я перепутал указатели. Предполагается генерировать кучу случайных чисел в зависимости от ввода пользователем.Нужна помощь по исправлению ошибки сегментации

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

int main(int argc, char *argv[]) 
{ 
    unsigned int mySeed; // creates our variables 
    unsigned int taps[2]; 
    unsigned int temp[2]; 
    unsigned int myToggle; 

    FILE *fp;//opens the file 
    fp = fopen("random.txt", "w");//sets the file to open equal to this file 
    int TapInputs = 1; 
    int count = 0; 
    int tap; 
    int myNewNumber = 0; 
    mySeed = atoi(argv[1]); 

    if(atoi(argv[1]) > 0) //Error checking for negative inputs. 
    { 
    printf("Please enter the taps you'd like to use : ");//prompts user to input the taps and then makes sure theyre in range 
    while(TapInputs) 
    { 
     scanf("%d",&tap); 
     if((tap > 0)&&(tap < 33)) 
     { 
      *(taps+count)=tap; 
     } 
     else if(tap == -1) // when we find -1 we do this 
     { 
      TapInputs = 0; 
     } 
     else if(tap > 32) 
     { 
      exit(0); 
     } 
     count++; 
    } 
    printf("How many numbers do you want to generate: "); //prompts user to input the number of numbers to use 
    scanf("%d", &myNewNumber); 
    while (myNewNumber < 0)// error checking for positive inputs 
    { 
     printf("How many numbers do you want to generate: "); 
     scanf("%d", &myNewNumber); 
    } 
    printf("\nRandom Numbers:"); 
    while(myNewNumber)//creates number equal to the user input number in the previous step 
    { 
    temp[0] = mySeed; // makes temp1 the seed 
    temp[1] = mySeed; // makes temp2 the seed 
    temp[0] = (temp[0] >> taps[0]) & 1; // checks and sets the bit 
    temp[1] = (temp[1] >> taps[1]) & 1; // checks and sets the bit 
    myToggle = (temp[0]^temp[1]); // here we xor the temp1 and 2 
    mySeed = (mySeed << 1)^myToggle; // use bittoggle to shift the seed and generate a new number 

    fprintf(fp, "%d\r\n", mySeed); // wrties the generated number into the file 

    printf("\n%d", mySeed); // prints the number 
    myNewNumber -= 1; 
    } 
    fclose(fp); // closes file, creates a new line and returns 0 to the fucntion 
    printf("\n"); 
    return 0; 
    } 
    else 
    { // if the number the user input was 0 we will end our program 
    exit(0); 
    } 
} 

Ошибка происходит сразу после исполнения.

+1

Вы хотите запустить программу на стороне, используя отладчик, по крайней мере, узнать, где он выходит из строя. – alk

+1

@alk ... или использовать заявления печати в стратегических местах. –

+0

Ну, я никогда не достигаю первого заявления печати в программе. –

ответ

0

Этот фрагмент кода:

while(TapInputs) 
{ 
    scanf("%d",&tap); 
    if((tap > 0)&&(tap < 33)) 
    { 
     *(taps+count)=tap; 
    } 
    else if(tap == -1) // when we find -1 we do this 
    { 
     TapInputs = 0; 
    } 
    else if(tap > 32) 
    { 
     exit(0); 
    } 
    count++; 
} 

выполняется до тех пор, пока не найдете TapInputs быть false, или другими словами 0. Это произойдет только в том случае, если вы дадите -1 в качестве ввода scanf("%d", &tap). До тех пор вы будете продолжать читать, а также Приращениеcount.

Но некоторые строки выше, вы объявили

unsigned int taps[2]; 

и в вашем while цикле вы

*(taps+count)=tap; 

Итак, если вы прочитали tap достаточное количество раз, и продолжают находить его между 0 и 33 , пока вы не найдете его -1, count будет достаточно увеличенным, чтобы вывести ваш массив за пределы.

+0

Я не думаю, что программа даже доходит до этой строки кода. –

0

Я думаю, что проблема в этой строке, mySeed = atoi (argv [1]); вы должны сделать что-то вроде этого, вы можете поместить код с, что в если условие,

if(agrc>1) 
{ 
    mySeed = atoi(argv[1]); 
    --------------------- 
    --------------------  
} 
I have tested...it is working 


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

int main(int argc, char *argv[]) 
{ 
unsigned int mySeed; // creates our variables 
unsigned int taps[2]; 
unsigned int temp[2]; 
unsigned int myToggle; 

FILE *fp;//opens the file 
fp = fopen("random.txt", "w");//sets the file to open equal to this file 
int TapInputs = 1; 
int count = 0; 
int tap; 
int myNewNumber = 0; 
if(agrc>1) 
{ 
mySeed = atoi(argv[1]); 

if(atoi(argv[1]) > 0) //Error checking for negative inputs. 
{ 
printf("Please enter the taps you'd like to use : ");//prompts user to input the taps and then makes sure theyre in range 
while(TapInputs) 
{ 
    scanf("%d",&tap); 
    if((tap > 0)&&(tap < 33)) 
    { 
     *(taps+count)=tap; 
    } 
    else if(tap == -1) // when we find -1 we do this 
    { 
     TapInputs = 0; 
    } 
    else if(tap > 32) 
    { 
     exit(0); 
    } 
    count++; 
} 
printf("How many numbers do you want to generate: "); //prompts user to input the number of numbers to use 
scanf("%d", &myNewNumber); 
while (myNewNumber < 0)// error checking for positive inputs 
{ 
    printf("How many numbers do you want to generate: "); 
    scanf("%d", &myNewNumber); 
} 
printf("\nRandom Numbers:"); 
while(myNewNumber)//creates number equal to the user input number in the previous step 
{ 
temp[0] = mySeed; // makes temp1 the seed 
temp[1] = mySeed; // makes temp2 the seed 
temp[0] = (temp[0] >> taps[0]) & 1; // checks and sets the bit 
temp[1] = (temp[1] >> taps[1]) & 1; // checks and sets the bit 
myToggle = (temp[0]^temp[1]); // here we xor the temp1 and 2 
mySeed = (mySeed << 1)^myToggle; // use bittoggle to shift the seed and generate a new number 

fprintf(fp, "%d\r\n", mySeed); // wrties the generated number into the file 

printf("\n%d", mySeed); // prints the number 
myNewNumber -= 1; 
} 
fclose(fp); // closes file, creates a new line and returns 0 to the fucntion 
printf("\n"); 
return 0; 
} 
else 
{ // if the number the user input was 0 we will end our program 
exit(0); 
} 
} 
}