可以成功创建一个函数,该函数输入可以选择的5个项目的二维数组,打印这些项目,然后询问您想要的项目,然后将您选择的项目放入一个收据中。是我在main中全局定义的另一个2d数组。这是一个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;

}


在我较大的程序中,它处于循环状态,这样我可以多次执行此过程,并在收据中选择不同的选择。在main内部,我可以调用receive [x],它可以正常工作。我使用静态全局变量arrnum来跟踪收据中有多少项目以及放置下一个项目的位置。每次调用select()时,Arrnum都会递增。但是在我创建的出于某种原因打印收据的函数中,arrnum重置为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;

}

09-30 14:12