Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将一个变量传递给多个函数,但没有得到期望的结果_C_Function_Parameter Passing_Pass By Reference - Fatal编程技术网

C 将一个变量传递给多个函数,但没有得到期望的结果

C 将一个变量传递给多个函数,但没有得到期望的结果,c,function,parameter-passing,pass-by-reference,C,Function,Parameter Passing,Pass By Reference,在我把它分解成函数之前,我已经让它工作了。我肯定这只是一个&或者*我错过了某个地方,但我似乎无法理解。用户输入一个数字,然后在菜单上选择F,让它打印0-number。我在显示功能中得到垃圾 #include <stdio.h> char menu(); int read_int(int number); void display(int number); int main(int argc, char ** argv) { int number = 0; char ch

在我把它分解成函数之前,我已经让它工作了。我肯定这只是一个&或者*我错过了某个地方,但我似乎无法理解。用户输入一个数字,然后在菜单上选择F,让它打印0-number。我在显示功能中得到垃圾

#include <stdio.h>

char menu();
int read_int(int number);
void display(int number);

int main(int argc, char ** argv) {
int number = 0;     
char choice = 'O';
while (choice != 'X'){


    choice = menu();    

    if (choice != 'N' && choice != 'F' && choice != 'X'){
        printf("Invalid Input. Enter N, F, or X\n");
    }

    else if (choice == 'N'){
        number = read_int(number);

    }

    else if (choice == 'F'){        
        display(number);            
    }




}

}


char menu ()
{
char i;
printf("\nEnter N to enter an integer from 0 to 20\nEnter F to display the first N+1 numbers (beginning with zero) on the console \nEnter X to quit the program \n");

printf("Your Choice: ");
scanf("%s",  &i);
return i;
}   

int read_int(number)
{
//int number = 0;
printf("\nEnter an integer 0-20: ");
scanf("%d", &number);
if (number >=0 && number <=20)
    return number;
else{
    printf("Enter a valid number between 0 and 20");    
    read_int(number);
}
}

void display(answer)
{
int count = 0;
printf("\nNumber equals: ");
printf("%d", answer);   
//while (count <= number){
//  printf("%d",count);
//  printf(" , ");
//  count++;
//}
}
它似乎正在使用以下代码:

#include <stdio.h>

char menu();
int read_int(int number);
void display(int answer);

int main(int argc, char ** argv) {
    int number = 0;     
    char choice = 'O';
    while (choice != 'X'){


    choice = menu();    

    if (choice != 'N' && choice != 'F' && choice != 'X'){
        printf("Invalid Input. Enter N, F, or X\n");
    }

    else if (choice == 'N'){
        number = read_int(number);
        printf("\nNumber equals: ");
        printf("%d", number);   

    }

    else if (choice == 'F'){
        //printf("\nNumber equals: ");
        //printf("%d", number);         
        display(number);            
    }




}

}


char menu ()
{
    char i; 
    printf("\nEnter N to enter an integer from 0 to 20\nEnter F to display the first N+1 numbers (beginning with zero) on the console \nEnter X to quit the program \n");

    printf("Your Choice: ");
    scanf("%s",  &i);
    return i;
}   

int read_int(int number)
{
number = 0;
    printf("\nEnter an integer 0-20: ");
    scanf("%d", &number);
    if (number >=0 && number <=20)
        return number;
    else{
        printf("Enter a valid number between 0 and 20");    
        return read_int(number);
    }
}

void display(int answer)
{
int count = 0;
//printf("\nNumber equals: ");
//printf("%d", answer); 
//int toprint = answer;
while (count <= answer){            
    printf("%d",count);
    printf(" , ");
    count=count+1;
}
}

现在将其转换为汇编!哦,孩子

您的scanf呼叫错误:

 scanf("%s",  &i);
您只读取一个字符。应该是:

 scanf(" %c",  &i);

我添加的前导空格或任何空格字符将确保丢弃输入流中剩余的任何空格字符。

您的scanf调用错误:

 scanf("%s",  &i);
您只读取一个字符。应该是:

 scanf(" %c",  &i);

我添加的前导空格或任何空格字符将确保丢弃输入流中剩余的任何空格字符。

read\u int不返回任何内容,这意味着它在进行递归调用时可以返回任何内容。

read\u int不返回任何内容,这意味着它在进行递归调用时可以返回任何内容递归调用。

在从自身调用read\u int的控制路径上,程序行为未定义。您需要返回该值:

返回read_intnumber

我很惊讶你的编译器没有警告你这一点。你有关闭的警告吗


<>我也会考虑用这个来消除递归;如果您有一个特别有害的用户,您的调用堆栈可能会溢出—在某些平台上,调用堆栈的大小令人惊讶。

您的程序行为在从自身调用read_int的控制路径上是未定义的。您需要返回该值:

char menu (void){
    char i[2];
    printf("\nEnter N to enter an integer from 0 to 20\nEnter F to display the first N+1 numbers (beginning with zero) on the console \nEnter X to quit the program \n");
    printf("Your Choice: ");
    scanf("%1s", i);
    return *i;
}   

int read_int(int number)//add int
{
    printf("\nEnter an integer 0-20: ");
    scanf("%d", &number);
    if (number >=0 && number <=20)
        return number;
    else{
        printf("Enter a valid number between 0 and 20");    
        return read_int(number);//add return
    }
}

void display(int answer)//add int
{
    int count = 0;
    printf("\nNumber equals: ");
    printf("%d\n", answer);
}
返回read_intnumber

我很惊讶你的编译器没有警告你这一点。你有关闭的警告吗


<>我也会考虑用这个来消除递归;如果您有一个特别有害的用户,您可能会溢出调用堆栈(在某些平台上,调用堆栈非常小)。

您的read\u int不会返回递归调用的结果,因此程序未定义。它的参数也是无意义的。你可以在函数read\u int return read\u intnumber中实现这一点;您的read_int不会返回递归调用的结果,因此程序未定义。它的参数也是无意义的。你可以在函数read\u int return read\u intnumber中实现这一点;我已经做了类似的设置,但调用displayint answerEnter N输入0到20之间的整数输入F在控制台上显示以零开始的前N+1个数字输入X退出程序您的选择:N输入整数0-20:5数字等于:5输入N输入0到20之间的整数输入F显示前N+1个数字从控制台上的零开始,输入X退出程序。您的选择:F Number等于:00,无法确定此处的格式。感觉迟钝。当调用函数时,它打印00。使用Nasm和gcc。运行同一个程序根本不编译,只需再次运行./a.out,第二次/第三次将提供完全不同的结果。这次我得到了50,1,2,3,4,5,所以它成功了!虽然count虽然count void displayint numberI的设置与此类似,但调用displayint answerEnter N输入0到20之间的整数输入F在控制台上显示以零开始的前N+1个数字输入X退出程序您的选择:N输入整数0-20:5数字等于:5输入N输入0到20之间的整数输入F显示前N+1个数字从控制台上的零开始,输入X退出程序。您的选择:F Number等于:00,无法确定此处的格式。感觉迟钝。当调用函数时,它打印00。使用Nasm和gcc。运行同一个程序根本不编译,只需再次运行./a.out,第二次/第三次将提供完全不同的结果。这次我得到了50,1,2,3,4,5,所以它成功了!while count while count void displayint number
char menu (void){
    char i[2];
    printf("\nEnter N to enter an integer from 0 to 20\nEnter F to display the first N+1 numbers (beginning with zero) on the console \nEnter X to quit the program \n");
    printf("Your Choice: ");
    scanf("%1s", i);
    return *i;
}   

int read_int(int number)//add int
{
    printf("\nEnter an integer 0-20: ");
    scanf("%d", &number);
    if (number >=0 && number <=20)
        return number;
    else{
        printf("Enter a valid number between 0 and 20");    
        return read_int(number);//add return
    }
}

void display(int answer)//add int
{
    int count = 0;
    printf("\nNumber equals: ");
    printf("%d\n", answer);
}