#5
by かずま » 7年前
最初の 1行に後続のデータの行数があり、
そのデータは 1行に 2個あるというものを
読み込みたいだけなら、次のように書けば済みます。
コード:
#include <stdio.h> // fgets, sscanf, printf
#include <stdlib.h> // malloc, free
#define MAX 256
int main(void)
{
int i, n, m;
char str[MAX];
int (*a)[2];
if (!fgets(str, sizeof(str), stdin)) return 1;
sscanf(str, "%d%d", &n, &m);
printf("n = %d, m = %d\n", n, m);
a = malloc(sizeof(int[2]) * n);
if (!a) return 2;
for (i = 0; i < n; i++) {
if (!fgets(str, sizeof(str), stdin)) return 3;
sscanf(str, "%d%d", &a[i][0], &a[i][1]);
}
for (i = 0; i < n; i++)
printf(" %d %d\n", a[i][0], a[i][1]);
free(a);
return 0;
}
どうしてもポインタのポインタを使って、元のプログラムのように
書きたいのであれば、こうなるのかな?
コード:
#include <stdio.h> // fgets, printf
#include <stdlib.h> // atoi, malloc, free
#include <string.h> // strtok
#define MAX 256
#define LINE 100
int main(void)
{
int i, n, m;
char str[MAX];
int **ppa;
int *pa[LINE];
if (!fgets(str, sizeof(str), stdin)) return 1;
n = atoi(strtok(str, " "));
m = atoi(strtok(NULL, " "));
printf("n = %d, m = %d\n", n, m);
if (n > LINE) return 2;
ppa = pa;
for (i = 0; i < n; i++) {
if (!fgets(str, sizeof(str), stdin)) return 3;
*ppa = malloc(sizeof(int) * 2);
if (!*ppa) return 4;
(*ppa)[0] = atoi(strtok(str, " "));
(*ppa++)[1] = atoi(strtok(NULL, " "));
}
ppa = pa;
for (i = 0; i < n; i++) {
printf(" %d %d\n", (*ppa)[0], (*ppa)[1]);
free(*ppa++);
}
return 0;
}
読み込んだ結果を表示しながら、終了時の free を実行していますが、
これらを別々にしたいなら、次のようにしましょう。
コード:
ppa = pa;
for (i = 0; i < n; i++) {
printf(" %d %d\n", (*ppa)[0], (*ppa)[1]);
ppa++;
}
// 上記の表示の代わりに、読み込んだデータの処理を書いてください。
// (*ppa)[0] の代わりに pa[i][0] も使えます。
// データが要らなくなったら、freeしましょう。
ppa = pa;
for (i = 0; i < n; i++) free(*ppa++);
最初の 1行に後続のデータの行数があり、
そのデータは 1行に 2個あるというものを
読み込みたいだけなら、次のように書けば済みます。
[code=c]
#include <stdio.h> // fgets, sscanf, printf
#include <stdlib.h> // malloc, free
#define MAX 256
int main(void)
{
int i, n, m;
char str[MAX];
int (*a)[2];
if (!fgets(str, sizeof(str), stdin)) return 1;
sscanf(str, "%d%d", &n, &m);
printf("n = %d, m = %d\n", n, m);
a = malloc(sizeof(int[2]) * n);
if (!a) return 2;
for (i = 0; i < n; i++) {
if (!fgets(str, sizeof(str), stdin)) return 3;
sscanf(str, "%d%d", &a[i][0], &a[i][1]);
}
for (i = 0; i < n; i++)
printf(" %d %d\n", a[i][0], a[i][1]);
free(a);
return 0;
}
[/code]
どうしてもポインタのポインタを使って、元のプログラムのように
書きたいのであれば、こうなるのかな?
[code=c]
#include <stdio.h> // fgets, printf
#include <stdlib.h> // atoi, malloc, free
#include <string.h> // strtok
#define MAX 256
#define LINE 100
int main(void)
{
int i, n, m;
char str[MAX];
int **ppa;
int *pa[LINE];
if (!fgets(str, sizeof(str), stdin)) return 1;
n = atoi(strtok(str, " "));
m = atoi(strtok(NULL, " "));
printf("n = %d, m = %d\n", n, m);
if (n > LINE) return 2;
ppa = pa;
for (i = 0; i < n; i++) {
if (!fgets(str, sizeof(str), stdin)) return 3;
*ppa = malloc(sizeof(int) * 2);
if (!*ppa) return 4;
(*ppa)[0] = atoi(strtok(str, " "));
(*ppa++)[1] = atoi(strtok(NULL, " "));
}
ppa = pa;
for (i = 0; i < n; i++) {
printf(" %d %d\n", (*ppa)[0], (*ppa)[1]);
free(*ppa++);
}
return 0;
}
[/code]
読み込んだ結果を表示しながら、終了時の free を実行していますが、
これらを別々にしたいなら、次のようにしましょう。
[code=c]
ppa = pa;
for (i = 0; i < n; i++) {
printf(" %d %d\n", (*ppa)[0], (*ppa)[1]);
ppa++;
}
// 上記の表示の代わりに、読み込んだデータの処理を書いてください。
// (*ppa)[0] の代わりに pa[i][0] も使えます。
// データが要らなくなったら、freeしましょう。
ppa = pa;
for (i = 0; i < n; i++) free(*ppa++);
[/code]