2015-11-24 23 views
-3

Okive按钮设法创建一个函数,输入5个项目的二维数组,您可以从中进行选择,打印项目然后询问您需要的项目,然后把你选择的那个项目放到一个reciept中,这是我在main中全局定义的另一个二维数组。这里是一个MCVE:由于某些原因,我不明白全局变量重置的值

char receipt[20][200]; 
static int arrnum=0; 

void choose(char arr[5][200]){ 
    int i; 

    for(i=0;i<=4;i++){ 
    printf("%s\n",arr[i]); 
    } 

    printf("Enter in your choice"); 
    int choice; 
    scanf("%d",&choice); 
    strcpy(receipt[arrnum],arr[choice-1]); 
    printf("receipt[0]:%s\n",receipt[0]); 
    arrnum++; 

} 
    void printreceipt(){ 
    int qnum=0; 

    printf("Receipt:\n"); 
    int itmnum=0; 
    while(qnum<arrnum){ 
     printf("Item %d:\n%s",itmnum,receipt[qnum]); 
     itmnum++; 
     qnum++; 
    } 

} 
int main(){ 
    char strings[5][200]= {"string1","string2","string3","string4","string5"}; 
    choose(strings); 
    printreceipt(); 
    return 0; 

} 

在我的大计划的一个循环,这样我可以经由过程多次,有我拿起收据内不同的选择。主内部我可以调用receipt [x]并且它可以正常工作。我使用一个静态全局变量arrnum来跟踪收据内的物品数量以及放置下一个物品的位置。每次调用choose()时都会增加阿拉姆数量。但在我创建打印收据的功能中,arrnum重置为0.

+0

在这段代码中,你永远不会改变'arrnum',所以它始于'0'并永远保持在'0'。 'printreceipt'中的循环永远不会进入循环体,因为'0 <0'为false –

+0

您的全局变量会重置,因为您正试图自行重置它。尝试访问它并通过代码中的其他赋值语句更改其值,并查看它如何处理所需的任务。也请在主函数中写入东西,这会自动限制程序的全局和本地访问功能.... –

+1

请参阅此-'strcpy(收据[arrnum],arr [choice-1]);''choice''是由用户输入的,但是如果'choice'是'0'呢?然后在'strcpy'中它会是'arr [-1]'。所以,这也会造成一个问题。而且你不验证输入。 – ameyCU

回答

0

我修复了一些程序。此版本无需制作变量静态即可工作。它基本上将索引号从主线传递给选择功能,然后传递给打印接收功能。

我还添加了一些基本的错误检查,以确保数量在范围内。

您将需要使用代码来使其满足您的需求。

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

char receipt[20][200]; 

int choose(char arr[5][200],int arrnum){ 
    int i; 
    for(i=0;i<=4;i++){ 
    printf("%s\n",arr[i]); 
    } 
    int choice=0; 
    while (choice < 1 || choice > 4){ 
    printf("Enter in your choice "); 
    scanf("%d",&choice); 
    } 
    strcpy(receipt[arrnum],arr[choice-1]); 
    printf("receipt[%d]:%s\n",arrnum,receipt[arrnum]); 
    arrnum++; 
    return arrnum; 
} 
void printreceipt(int arrnum){ 
    printf("Receipt:\n"); 
    int itmnum=0; 
    while(itmnum<arrnum){ 
    printf("Item %d: %s\n",itmnum+1,receipt[itmnum]); 
    itmnum++; 
    } 

} 
int main(){ 
    int items=0; 
    char strings[5][200]= {"string1","string2","string3","string4","string5"}; 
    items=choose(strings,items); 
    // items=choose(strings,items); <--add more of these lines if you want more items on the receipt. 
    printreceipt(items); 
    return 0; 

}