值未初始化为 c 中的变量

Value is not initialized into the variable in c

提问人:Ashiful Islam Prince 提问时间:9/25/2020 最后编辑:Ashiful Islam Prince 更新时间:12/5/2020 访问量:348

问:

这是我制作的程序:

#include <stdio.h>

int main(void)
{
    //Put variables here
    int space = 0;
    int num_of_rows = 0;
    int p = 1;
    int t = 0;
    char alphabet[100] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

    get_and_validate_user_input(num_of_rows);
    printf(" The number of rows are : %d", num_of_rows);
}

void get_and_validate_user_input(int num_of_rows)
{
    //Input validation
    while (1)
    {
        printf("Enter the number of rows : ");
        //Getting the input from the user
        scanf("%d", &num_of_rows);

        if (num_of_rows <= 0)
        {
            printf("Negative numbers are not allowed here \n");
        }
        else
        {
            break;
        }
    }
}

预期输入: 输入行数:5

预期输出: 行数为:5

但是从我的代码输出显示错误。显示:行数为:0

现在我的问题是:我的程序出了什么问题?我该如何解决这个问题?

C 作用域 按值传递 函数声明

评论

0赞 klutt 9/25/2020
您是否阅读了编译器警告?
2赞 Lundin 9/25/2020
请以某种理智的方式格式化您的代码。期望其他人阅读这些混乱的代码是很粗鲁的。然后研究函数和参数传递的工作原理。
3赞 Vlad from Moscow 9/25/2020
@Ashiful Islam Prince You 用零 int num_of_rows=0; 初始化了变量。所以你正在做的就是你所得到的.:) 该函数处理变量值的副本。因此,更改副本不会影响原始变量。
0赞 Ashiful Islam Prince 9/25/2020
是的,但我不明白它说了什么。它说函数的隐式声明和此函数的冲突类型。@klutt
1赞 Some programmer dude 9/25/2020
函数参数是按值传递的,这意味着该值被复制到参数变量中。修改副本不会更改原件。请在 C 语言中做一些关于模拟引用传递的研究。

答:

1赞 bruno 9/25/2020 #1

您的问题是get_and_validate_user_input修改局部变量 num_of_rows =>值在 main 中保持 0

如果您想修改num_of_rows也出于get_and_validate_user_input按地址而不是按值提供它,例如(未使用的变量注释,修改签入get_and_validate_user_input以与消息兼容):

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

void get_and_validate_user_input(int * num_of_rows);

int 
main(void){
  //Put variables here
  //int space=0;
  int num_of_rows=0;
  //int p=1;
  //int t=0;
  //char alphabet[100]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
  
  get_and_validate_user_input(&num_of_rows);
  printf(" The number of rows is : %d\n",num_of_rows);
  return 0;
 }

void get_and_validate_user_input(int * num_of_rows){
  //Input validation
  while(1){
    printf("Enter the number of rows : ");
    //Getting the input from the user
    if (scanf("%d",num_of_rows) != 1) {
      int c;

      puts("Invalid input");
      // invalid input, bypass all the line
      while ((c = getchar()) != '\n') {
        if (c == EOF) {
          puts("EOF, abort");
          exit(-1);
        }
      }
    }
    else if(*num_of_rows < 0){ // 0 seems allowed, else update message
      printf("Negative numbers are not allowed here \n");
    }
    else {
      break;
    }
  }
}

编译和执行:

/tmp % gcc -Wall c.c
/tmp % ./a.out
Enter the number of rows : 12
 The number of rows is : 12
/tmp % ./a.out
Enter the number of rows : aze
Invalid input
Enter the number of rows : -2
Negative numbers are not allowed here 
Enter the number of rows : 12
 The number of rows is : 12
/tmp % 
1赞 Vlad from Moscow 9/25/2020 #2

编译器看不到调用点

get_and_validate_user_input(num_of_rows);

函数是如何声明的。因此,编译器发出一条消息。默认情况下,它期望函数具有返回类型,但是当它遇到函数定义时,它看到返回类型是 。get_and_validate_user_inputintvoid

将函数声明放在 main 之前。

函数中未使用传递参数的值

void get_and_validate_user_input(int num_of_rows){
    //...
    //Getting the input from the user
    scanf("%d",&num_of_rows);
    //...

函数参数 num_of_rows 是函数的局部变量,由传递的参数的值初始化。因此,更改局部变量不会影响原始参数。

您可以声明和定义函数,例如

int get_and_validate_user_input( void )
{
    int num_of_rows = 0;

    //Input validation
    while (1)
    {
        printf("Enter the number of rows : ");
        //Getting the input from the user
        scanf("%d", &num_of_rows);

        if (num_of_rows <= 0)
        {
            printf("Negative numbers are not allowed here \n");
        }
        else
        {
            break;
        }
    }

    return num_of_rows;
}

并称它为主要

num_of_rows = get_and_validate_user_input();

评论

0赞 Ashiful Islam Prince 9/25/2020
先生,我明白了,我错了。谢谢。@Vlad(来自莫斯科)