ページ 1 / 1
malloc関数とポインタ配列についてです
Posted: 2019年7月03日(水) 23:19
by kazukazukazu
文字列を入力してファイルに出力するプログラムを作成したいです。その際malloc関数を用いてポインタ配列と要素の関連付を行いたいのですが上手く行きません。
コード:
#include <stdio.h>
#include <stdlib.h>
int main(){
char * name[5];
int i;
FILE * fp;
if((fp=fopen("05write_person.txt","w"))==NULL){
return 1;
}
for(i=0; i<5; i++){
printf("%d番目の人名を入力してください;", i+1);
*name = (char *) malloc(sizeof(char) * 10);
scnaf("%s", name[i]);
}
for(i=0; i<5; i++){
fprintf(fp, "%s", name[i]);
}
fclose(fp);
free(name);
printf("¥n入力した名前をファイルに入力しました。 ¥n");
}
今のところこののような形なのですが、以下のような初見のエラーが出てしまい、困っております。
コード:
warning: implicit declaration of function 'scnaf' is invalid in C99
[-Wimplicit-function-declaration]
scnaf("%s", name[i]);
^
1 warning generated.
Undefined symbols for architecture x86_64:
"_scnaf", referenced from:
_main in 6-3-98276b.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Re: malloc関数とポインタ配列についてです
Posted: 2019年7月04日(木) 01:01
by box
コード:
scnaf("%s", name[i]);
関数名のスペルが間違っているようにしか見えないのですが…。
Re: malloc関数とポインタ配列についてです
Posted: 2019年7月04日(木) 01:40
by kazukazukazu
kazukazukazu さんが書きました: ↑6年前
文字列を入力してファイルに出力するプログラムを作成したいです。その際malloc関数を用いてポインタ配列と要素の関連付を行いたいのですが上手く行きません。
コード:
#include <stdio.h>
#include <stdlib.h>
int main(){
char * name[5];
int i;
FILE * fp;
if((fp=fopen("05write_person.txt","w"))==NULL){
return 1;
}
for(i=0; i<5; i++){
printf("%d番目の人名を入力してください;", i+1);
*name = (char *) malloc(sizeof(char) * 10);
scanf("%s", name[i]);
}
for(i=0; i<5; i++){
fprintf(fp, "%s", name[i]);
}
fclose(fp);
free(name);
printf("¥n入力した名前をファイルに入力しました。 ¥n");
}
今のところこののような形なのですが、以下のような初見のエラーが出てしまい、困っております。
コード:
warning: implicit declaration of function 'scnaf' is invalid in C99
[-Wimplicit-function-declaration]
scnaf("%s", name[i]);
^
1 warning generated.
Undefined symbols for architecture x86_64:
"_scnaf", referenced from:
_main in 6-3-98276b.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Re: malloc関数とポインタ配列についてです
Posted: 2019年7月04日(木) 01:41
by kazukazukazu
こちらの確認不足でした。申し訳ないです。修正したもののやはりうまく行きません
Re: malloc関数とポインタ配列についてです
Posted: 2019年7月04日(木) 03:34
by かずま
*name = は、name[0] = と同じです。
5回 malloc を呼び出して、5個の領域を確保したのに、
全部 name[0] にポインタが上書きされています。
name[ i] = にしましょう。
free も name に対して、5回実行してください。
Re: malloc関数とポインタ配列についてです
Posted: 2019年7月04日(木) 05:04
by かずま
かずま さんが書きました: ↑6年前
free も name に対して、5回実行してください。
free も name[ i] に対して、5回実行してください。
Re: malloc関数とポインタ配列についてです
Posted: 2019年7月04日(木) 05:33
by Math
Windows10、CX-Buider (bcc32c エンバカデロC相当として使用)
の場合
プログラム
main.c
コード:
#include <stdio.h>
#include <stdlib.h>
int main(){
char * name[5];
int i;
FILE * fp;
if((fp=fopen("05write_person.txt","w"))==NULL){
return 1;
}
for(i=0; i<5; i++){
printf("%d番目の人名を入力してください;", i+1);
name[i] = (char *) malloc(sizeof(char) * 10);
scanf("%s", name[i]);
}
for(i=0; i<5; i++){
fprintf(fp, "%s\n", name[i]);
}
fclose(fp);
//for(int i=0;i<5;i++)free(name[i]); //今回はプログラム終了するため不要です
printf("\n入力した名前をファイルに入力しました。 \n");
}
実行結果
コード:
C:\19\19c\bcc32c>"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\bcc32c" main.c
Embarcadero C++ 7.40 for Win32 Copyright (c) 2012-2018 Embarcadero Technologies, Inc.
main.c:
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
C:\19\19c\bcc32c>dir main.exe
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 7813-6100 です
C:\19\19c\bcc32c のディレクトリ
2019/07/04 05:25 89,088 main.exe
1 個のファイル 89,088 バイト
0 個のディレクトリ 94,287,560,704 バイトの空き領域
C:\19\19c\bcc32c>main.exe
1番目の人名を入力してください;aaa
2番目の人名を入力してください;bbb
3番目の人名を入力してください;ccc
4番目の人名を入力してください;ddd
5番目の人名を入力してください;eee
入力した名前をファイルに入力しました。
C:\19\19c\bcc32c>pause
続行するには何かキーを押してください . . .
05write_person.txt
バッチファイル cx.bat
コード:
"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\bcc32c" main.c
dir main.exe
main.exe
pause
Re: malloc関数とポインタ配列についてです
Posted: 2019年7月04日(木) 05:40
by Math
本来 課題として与えられたものは可変長配列のような気がするが一応固定長ならこれでいいでしょうね。
詳しくは
viewtopic.php?f=3&t=20659
を参考にしてください。
Re: malloc関数とポインタ配列についてです
Posted: 2019年7月04日(木) 05:51
by Math
注:CX-Builderは ソースを UTF-8 で保存しないと日本語が化けます。