c语言数组问题,多输出数字

定义一个数组后,进行输出,但是无缘无故的多输出俩个1,想了很久没得到答案,帮助一下我吧

img

img

按照你的输入,在进入for循环之前

a[2] = 3, 并且打印了一个3,然后进入循环i = 1i < 3
第一次外层循环 i = 1; 
        内层循环从j = 0 到j < 1
             j = 0是,o = i (1), a[0] = a[2] - o = 2,  并打印出2
第二次循环 i = 2;
       内层循环,从j = 0 到 j < 2
              j = 0时,o = i = 2,   a[0] = a[2] - o = 3 - 2 = 1, 打印出  1
              j = 1 时, o = i = 2, a[1] = a[2] - o = 3 - 2 = 1 , 打印出 1
结束循环。
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7560983
  • 这篇博客也不错, 你可以看下C语言结构体的定义和用法,定义结构体,定义结构体变量,结构体变量赋初值,输出结构体变量的值
  • 除此之外, 这篇博客: C语言结构体数组,结构体数组的定义,结构体数组的输出,结构体的应用中的 案例一、 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1、编写一个函数,它的目的是为了输出所有性别为男的的职工信息
    算法分析:
    1)这个函数它不用返回值因为该函数是为了完成输出
    2)该函数要处理很多职工,就需要一个数组,数组的类型为职工类型
    注意:在C语言当中字符串不能直接比较是否相同,要通过strcmp这个函数来比较其两个字符串是否相同

    #include<stdio.h>
    #include<string.h> 
    typedef struct worker{
    	char id[10];
    	char name[10];
    	char sex[10];
    	int pay;
    }WOR;
    void QueryWorker(WOR a[],int n){//次函数是用来输出长度为n的工人数组的信息 
    	int i;
    	printf("全部员工:\n"); 
    	printf("工号\t姓名\t性别\t年龄\n"); 
    	for(i=0;i<6;i++){
    		printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
    	}
    	printf("所有男员工:\n"); 
    	printf("工号\t姓名\t性别\t年龄\n"); 
    	for(i=0;i<6;i++){
    		if(strcmp(a[i].sex,"男")==0){ 
    			printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
    		} 
    	}
    	printf("所有女员工:\n"); 
    	printf("工号\t姓名\t性别\t年龄\n"); 
    	for(i=0;i<6;i++){
    		if(strcmp(a[i].sex,"女")==0){ 
    			printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
    		} 
    	}
    }
    void main(){
    	WOR a[6]={ 
    		{"0001","陈文杰","男",1200},
    		{"0002","张三丰","女",5000},
    		{"0003","张四丰","女",1200}, 
    		{"0004","张五丰","男",2200},
    		{"0005","张六丰","男",5200},
    		{"0006","张七丰","男",6200} 
    	};
    	QueryWorker(a,6);
    }
    

    在这里插入图片描述
    2、能够输出指定性别的职工

    #include<stdio.h> 
    typedef struct worker{
    	char id[10];
    	char name[10];
    	char sex[10];
    	int pay;
    }WOR;
    void QueryBySex(WOR a[],int n,char b[]){//次函数是用来输出长度为n的工人数组的信息 
    	int i;
    	
    	printf("工号\t姓名\t性别\t年龄\n");  
    	for(i=0;i<6;i++){
    		if(strcmp(a[i].sex,b)==0){ 
    			printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
    		} 
    	}
    	
    }
    void main(){
    	WOR a[6]={ 
    		{"0001","陈文杰","男",1200},
    		{"0002","张三丰","女",5000},
    		{"0003","张四丰","女",1200}, 
    		{"0004","张五丰","男",2200},
    		{"0005","张六丰","男",5200},
    		{"0006","张七丰","男",6200} 
    	};
    	char b[10];
    	printf("请输入您要查询的性别 :\n");
    	scanf("%s",b);
    	QueryBySex(a,6,b);
    }
    
  • 您还可以看一下 李飞老师的C语言开发之数据结构与算法一课程中的 链表反转小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    对于题目中出现的问题,可能是因为数组越界或者内存泄漏等原因导致多输出了两个1。可以通过以下方法来解决:

    1. 确认数组的大小是否正确,是否有越界现象,数组越界容易导致有未定义的值被输出。

    2. 确认代码中是否有内存泄漏的情况,可以使用Valgrind等工具检查程序中的内存问题,及时发现和解决内存泄漏问题。

    3. 可以使用指针来遍历数组,以此来避免使用数组下标可能导致的问题。

    具体的代码实现如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int arr[5] = {1, 2, 3, 4, 5};
        int *p = arr;   // 使用指针 p 指向数组 arr
    
        // 使用指针遍历数组并输出
        for(int i = 0; i < 5; i++)
        {
            printf("%d ", *p);   // 输出指针所指向的值
            p++;   // 将指针 p 指向下一个元素
        }
    
        return 0;
    }
    

    通过使用指针遍历数组,可以避免使用数组下标可能导致的问题,避免出现多输出了两个1的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^