我正在嘗試創建一個程式,用戶輸入專案數(行)并為每個專案指定一個名稱(scanf),最多 30 個字符。
一旦我在 C 上學習這個,我想用指標的指標創建這個代碼。
我在代碼方面遇到了一些困難。
二維陣列的草圖。
代碼片段:
PS: #define MAX 31
char **items = NULL, *columns = NULL, name[MAX];
int rows, aux_rows;
printf("\nNumber of items:\n");
scanf("%d", &rows);
items = (char **) malloc(rows * sizeof(char*));
for (aux_rows = 0; aux_rows < rows; aux_rows ){
columns[aux_rows] = (char *) malloc(MAX * sizeof(char));
}
for (aux_rows = 0; aux_rows < rows; aux_rows ){
printf("\nName of item %d:\n", (aux_rows 1));
scanf("%s", name);
*items[aux_rows] = name;
}
uj5u.com熱心網友回復:
items被分配而不是columns。并用于strcpy復制字符。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 31
int main()
{
char **items = NULL, *columns = NULL, name[MAX];
int rows, aux_rows;
printf("\nNumber of items:\n");
scanf("%d", &rows);
items = (char **)malloc(rows * sizeof(char *));
for (aux_rows = 0; aux_rows < rows; aux_rows )
{
items[aux_rows] = malloc(MAX * sizeof(char));
}
for (aux_rows = 0; aux_rows < rows; aux_rows )
{
printf("\nName of item %d:\n", (aux_rows 1));
scanf("%s", name);
strcpy(items[aux_rows], name);
}
return 0;
}
$ gcc array2d.c
$ ./a.out
Number of items:
2
Name of item 1:
Hello
Name of item 2:
World!
$
uj5u.com熱心網友回復:
*items[aux_rows] = name;
在兩個方面是錯誤的。
兩者都*取消[]參考它們的一元運算元。如果items是一個char **,items[n]是一個char *,并且*items[n]是一個char。
這試圖將一個陣列分配給每個緩沖區的第一個元素。
其次,陣列不能通過賦值來復制。用于strcpy將字串從一個緩沖區復制到另一個緩沖區。
也就是說,您可以簡單地將字串直接讀取到預先分配的緩沖區中,并取消臨時緩沖區。
在這一行中,
columns[aux_rows] = (char *) malloc(MAX * sizeof(char));
columns應該是items。
一些注意事項:
sizeof (char)保證是1。它的使用是多余的。
的回傳malloc 不應該在 C 中強制轉換。
malloc可能會失敗。scanf可能會失敗。你應該養成不忽略回傳值的習慣。
scanf("%s", ...)和 一樣危險gets。至少,使用欄位寬度說明符來限制輸入(應該是緩沖區的大小減一)。
char foo[128];
if (1 != scanf("7s", foo))
/* handle error */;
請注意,使用%s限制輸入不包含任何空格。scanf通常是一個糟糕的工具,考慮使用基于行的方法fgets。
話雖如此,使這合理安全的最小更改:
#include <stdio.h>
#include <stdlib.h>
#define MAX 31
void die(const char *msg)
{
fprintf(stderr, "%s\n", msg);
exit(EXIT_FAILURE);
}
int main(void)
{
size_t rows;
printf("Number of items: ");
if (1 != scanf("%zu", &rows))
die("Failed to read input.");
char **items = malloc(sizeof *items * rows);
if (!items)
die("Failed to allocate memory.");
for (size_t i = 0; i < rows; i ) {
if (!(items[i] = malloc(MAX)))
die("Failed to allocate row.");
printf("Name of item %zu: ", i 1);
if (1 != scanf("0s", items[i]))
die("Failed to read item input.");
}
for (size_t i = 0; i < rows; i ) {
puts(items[i]);
free(items[i]);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473547.html
