Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays - Fatal编程技术网

c语言中的菜单驱动程序,用于对数组执行各种操作

c语言中的菜单驱动程序,用于对数组执行各种操作,c,arrays,C,Arrays,下面是我的c程序,它对数组执行各种操作。当我删除任何元素时,delete_ele函数会删除并正确显示数组,但traverse函数会显示一些垃圾值。例如,如果最初我有4个元素并删除了第一个元素,delete_ele函数将显示剩余的3个元素,但是遍历函数将显示4个元素(剩余的3个元素以及末尾的垃圾值)。请告诉我错误 #include<stdio.h> #include<conio.h> void insert_ele(int i,int ar[],int len){

下面是我的c程序,它对数组执行各种操作。当我删除任何元素时,delete_ele函数会删除并正确显示数组,但traverse函数会显示一些垃圾值。例如,如果最初我有4个元素并删除了第一个元素,delete_ele函数将显示剩余的3个元素,但是遍历函数将显示4个元素(剩余的3个元素以及末尾的垃圾值)。请告诉我错误

#include<stdio.h>
#include<conio.h>
void insert_ele(int i,int ar[],int len){
    int ele, loc;
    printf("\nEnter element to be inserted : ");
    scanf("%d",&ele);
    printf("\nEnter location : ");
    scanf("%d",&loc);
    if(i==19){
        printf("\nOverflow");
    }
    else{
        while(i>=loc){
            ar[i+1]=ar[i];
            i--;
        }
    ar[loc]=ele;
    len++;
    printf("\nNew Array : ");
    for(i=0;i<len;i++){
        printf("\t%d",ar[i]);
    }
    }
}
void delete_ele(int i,int ar[],int len){
    int loc;
    printf("\nEnter location of element to be deleted : ");
    scanf("%d",&loc);
    if(len==0){
        printf("\nUnderflow");
    }
    else{
        for(i=loc;i<len;i++){
            ar[i]=ar[i+1];
        }
        len--;
        printf("\nNew Array : ");
        for(i=0;i<len;i++){
        printf("\t%d",ar[i]);
        }
    }
}
void find_ele(int i,int ar[],int len){
    int ele, count=0;
    printf("\nEnter element to be searched : ");
    scanf("%d",&ele);
    for(i=0;i<len;i++){
        if(ar[i]==ele){
            count++;
        }
    }
    if(count == 0){
        printf("\nElement does not exist");
    }
    else{
        printf("\nElement found %d times",count);
    }
}
void traverse(int i, int ar[], int len){
    printf("\nTotal number of Elements are : %d",len);
    printf("\nElements are : ");
    for(i=0; i<len; i++){
        printf("\t%d",ar[i]);
    }
}
void main(){
    int ar[20], i=0, len=0, ch;
    char choice;
    clrscr();
    printf("\nEnter number of elements you want to insert : ");
    scanf("%d",&len);
    for(i=0; i<len; i++){
        printf("Enter element %d : ",i);
        scanf("%d",&ar[i]);
    }
    i--;
    label:
    printf("\nPress 1 to insert, 2 to delete, 3 to find any element");
    printf("\n or 4 to traverse the array : ");
    scanf("%d",&ch);
    switch(ch){
        case 1:insert_ele(i, ar, len);
        break;
        case 2:delete_ele(i, ar, len);
        break;
        case 3:find_ele(i, ar, len);
        break;
        case 4:traverse(i, ar, len);
        break;
        default:printf("\nInvalid Option");
        break;
    }
    printf("\nPress y to continue or any other key to quit : ");
    scanf("%s",&choice);
    if(choice=='y' || choice=='Y'){
        goto label;
    }
    getch();
}
#包括
#包括
无效插入元素(整数i,整数ar[],整数len){
国际电气公司,loc;
printf(“\n要插入的输入元素:”);
scanf(“%d”、&ele);
printf(“\n输入位置:”);
scanf(“%d”、&loc);
如果(i==19){
printf(“\nOverflow”);
}
否则{
while(i>=loc){
ar[i+1]=ar[i];
我--;
}
ar[loc]=ele;
len++;
printf(“\n新数组:”);

对于(i=0;i一个错误是:
delete_ele()
函数调用未定义的行为,因为当
len
值为
20
时,for循环中的数组索引超出范围(请阅读注释):

for(i=loc;i
应该是:

for(i = loc; i < len-1; i++){ # replaced `len` by `len - 1` 
    ar[i] = ar[i + 1]; 
}
for(i=loc;i

其他函数中也有类似的错误。

其中一个错误是:
delete_ele()
函数调用未定义的行为,因为当
len
值为
20
时,for循环中的数组索引超出范围(请阅读注释):

for(i=loc;i
应该是:

for(i = loc; i < len-1; i++){ # replaced `len` by `len - 1` 
    ar[i] = ar[i + 1]; 
}
for(i=loc;i

在其他函数中也有类似的错误。

问题是
main
中的
len
没有通过
delete\u ele
insert\u ele
更新。 通过值将
len
传递给这些函数。然后在相应函数内更新本地副本,但main中的
len
保持不变


纠正此问题的一种方法是通过引用将
len
传递到
delete\u ele
insert\u ele

问题是
main
中的
len
不能通过
delete\u ele
insert\ele
进行更新。 通过值将
len
传递给这些函数。然后在相应函数内更新本地副本,但main中的
len
保持不变


纠正此问题的一种方法是通过引用将
len
作为指针传递到
delete\u ele
insert\u ele
,因为您在
delete\ele()
中递减局部变量(
len

尝试:

void delete_ele(int i,int ar[],int*len){
int loc;
printf(“\n输入要删除元素的位置:”;
scanf(“%d”、&loc);
如果(*len==0){
printf(“\nUnderflow”);
}
否则{
对于(i=loc;i<(*len-1);i++){
ar[i]=ar[i+1];
}
(*len)--;
printf(“\n新数组:”);

对于(i=0;i,因为在
delete_ele()

尝试:

void delete_ele(int i,int ar[],int*len){
int loc;
printf(“\n输入要删除元素的位置:”;
scanf(“%d”、&loc);
如果(*len==0){
printf(“\nUnderflow”);
}
否则{
对于(i=loc;i<(*len-1);i++){
ar[i]=ar[i+1];
}
(*len)--;
printf(“\n新数组:”);

对于(i=0;i您是否尝试过单步执行调试器中的代码并检查变量的状态?这应该会让您直接找到您的错误。@PaulR是否可能重复?我不认为是重复的,尽管可以找到简单的错误,但标记为重复是无效的。您是否尝试过单步执行调试器中的代码并检查变量的状态?这应该直接带你们到你们的错误。可能重复的@paurr是重复的吗?我不认为,虽然简单的错误可以找到,但标记重复是无效的。对不起,我应该评论,但编辑,重点是条件应该是
(*len-1)
Ops,对不起Grijesh,我没有看到这一点,可以随意编辑很多Hanks。工作起来很有魅力…@rippy检查循环条件应该是
*len-1
,否则当
len=20
时,它会给数组出索引问题。另外在
之后添加空格;
对不起,我应该注释,但需要编辑,重点是条件应该是
(*len-1)
Ops,对不起,Grijesh,我没看到,可以自由编辑大量的Hanks。工作起来很有魅力…@rippy检查循环条件应该是
*len-1
,否则当
len=20
时会给数组出索引问题。在
之后也添加空格;
void delete_ele(int i, int ar[], int *len){
    int loc;
    printf("\nEnter location of element to be deleted : ");
    scanf("%d", &loc);
    if(*len == 0){
        printf("\nUnderflow");
    }
    else{
        for(i=loc; i< (*len - 1); i++){
            ar[i] = ar[i + 1];
        }
        (*len)--;
        printf("\nNew Array : ");
        for(i=0; i<*len; i++){
           printf("\t%d", ar[i]);
        }
    }
}