mxwawaawxm 发表于 2019-12-3 22:39

这串C代码里为什么循环后数组元素的值都会发生改变

本帖最后由 mxwawaawxm 于 2019-12-4 22:28 编辑

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

int generate_num(int *nums);
void input_num(char *num_input);
int check_input_num(char *num_input);
void print_input_num(int valid, char *num_input);

int main(int argc, char *argv[])
{
    int nums = {0};
    char num_input;
    int quit=0;
   
    // 生成四个互不相同的数字,并存入数组
    generate_num(nums);
    printf("%d%d%d%d\n", nums, nums, nums, nums);
   
    do {
      printf("%d%d%d%d\n", nums, nums, nums, nums);
      
      // 输入四个互不相同的数字
      input_num(num_input);
      
    } while (quit==0);

    return 0;
}

/*生成四个互不相同的数字*/
int generate_num(int *nums)
{
    srand(time(NULL));
    int i=0,j;
    int num;
   
    while (i<4) {
      num=rand()%10;
      for (j=0;j<i;j++) {
            if (num == nums) {
                break;
            }
      }
      if (j!=i) {
            continue;
      }
      nums=num;
      i++;
    }
}

/*输入四个互不相同的数字*/
void input_num(char *num_input)
{
    int valid;
   
    do {
      fprintf(stdout, "请输入四个互不相同的数字:");
      scanf("%s", num_input);
      // 判断输入数字字符是否有效
      valid = check_input_num(num_input);
      // 判断完输入数字字符是否有效,打印反馈信息
      print_input_num(valid, num_input);
    } while (valid!=0);
}

int check_input_num(char *num_input)
{
    // 输入的字符长度不为4
    if (strlen(num_input)!=4) {
      return 1;
    }
   
    int i=0,j=0;
   
    for (i=0;i<4;i++) {
      // 输入的字符不是数字字符
      if (!isdigit(num_input)) {
            return 2;
      }
      for (j=0;j<i;j++) {
            // 输入的字符存在相同的数字
            if (num_input==num_input) {
                return 3;
            }
      }
    }
   
    return 0;
}

void print_input_num(int valid, char *num_input)
{
    switch (valid) {
      case 1:
            fprintf(stdout, "输入的字符%s长度不是4\n", num_input);
            break;
      case 2:
            fprintf(stdout, "输入的字符%s包含非数字字符\n", num_input);
            break;
      case 3:
            fprintf(stdout, "输入的字符%s包含相同的数字\n", num_input);
            break;
      default:
            break;
    }
}


上面的代码思路如此
int nums = {0};
先声明一个整型数组,4个元素初始化为0;

再调用函数generate_num(nums)生成四个互不相同的数字,并存入数组nums

再声明一个字符数组char num_input;,用以保存用户输入的4个数字字符

接着调用input_num(num_input),让用户输入数字。并利用check_input_num(num_input)函数检查数字是否有效,利用print_input_num(valid, num_input)函数输出反馈信息

回到main函数里,有一个循环,每次,我特意输出一次数组nums的元素。发现循环一次,数组nums的元素会发生改变{:301_1009:}这是哪里出错。编译器也没报错
请大侠们赐教
    do {
      printf("%d%d%d%d\n", nums, nums, nums, nums);
      
      // 输入四个互不相同的数字
      input_num(num_input);
      
      // quit = compare(nums, num_input);
    } while (quit==0);

mxwawaawxm 发表于 2019-12-4 19:16

本帖最后由 mxwawaawxm 于 2019-12-4 20:18 编辑

大佬们哪去了,没人回复{:301_1008:}


ps貌似搞清楚了‘
char num_input;
这个字符数组是用来存放4个数字字符,但C语言的字符串最后还有个结束字符'\0'
所以设定的长度4,不够存放

至少也要5{:301_1008:}
页: [1]
查看完整版本: 这串C代码里为什么循环后数组元素的值都会发生改变