簡體   English   中英

將指針傳遞給 C 中的函數

[英]Passing Pointers to Pointers into Functions in C

我正在研究 class 項目,我仍在學習 C。

目標是詢問用戶今天有多少商品可供出售,然后要求他們將這些商品一個接一個地輸入到新行中,並將它們輸入到字符串數組中。

然后將數組打印為列表以顯示可用項目。

我們不能使用靜態聲明的 arrays,只能使用指針。

這里的函數是必需的。 我需要讓 get_items() function 修改數組而不是返回結果。

我在讓 get_items() 工作時遇到了很多麻煩。 當我 go 打印數組的項目時,我嘗試的任何操作都以“退出,分段錯誤”或打印(NULL)告終。

任何使這項工作的建議將不勝感激。

char* get_item() {

  char *item = calloc(61,sizeof(char));
  scanf(" %[^\n]",item);

  return item;

}
void get_items(char ***items, int *num_items){

  int i;

    printf("Enter the %d available items one to a line: \n",*num_items);


  for(i = 0; i < *num_items; i++) {

    **(items+i) = get_item();

  }

}
int main(void) {

  char **items=NULL;    /* this is the pointer for the start of the ingredients array   */
  int num_items = -1,
  int i;

  printf("How many available items do we have today? ");
  scanf("%d",&num_items);

  items = calloc(num_items,sizeof(char*));

  get_items(&items,&num_items);

  printf("Available items today are: \n");

    for(i = 0; i < num_items; i++) {

    printf("%i. %s\n",i+1,*(items+i));

  }

get_items中, **(items+i)應該是*(*items+i)(*items)[i]

但是, get_items具有太多級別的指針取消引用。 以下更簡單:

void get_items(char **items, int num_items){

  int i;

    printf("Enter the %d available items one to a line: \n",num_items);


  for(i = 0; i < num_items; i++) {

    *(items+i) = get_item();  // or more readable: items[i] = get_item();

  }

}

然后,從main調用get_items需要更改為以下內容:

  get_items(items,num_items);

原始原型void get_items(char ***items, int *num_items)表明main中的一些代碼應該在get_items中完成:

void get_items(char ***items, int *num_items){
    int i;

    printf("How many available items do we have today? ");
    scanf("%d",num_items);

    *items = calloc(*num_items,sizeof(char*));

    printf("Enter the %d available items one to a line: \n",*num_items);

    for(i = 0; i < *num_items; i++) {
        *(*items+i) = get_item();
    }
}

那么main可以簡化為以下內容:

int main(void) {

    char **items=NULL;    /* this is the pointer for the start of the ingredients array   */
    int num_items = -1,
    int i;

    get_items(&items,&num_items);

    printf("Available items today are: \n");

    for(i = 0; i < num_items; i++) {
        printf("%i. %s\n",i+1,*(items+i));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM