malloc関数とポインタ配列についてです

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kazukazukazu
記事: 4
登録日時: 4年前

malloc関数とポインタ配列についてです

#1

投稿記事 by kazukazukazu » 4年前

文字列を入力してファイルに出力するプログラムを作成したいです。その際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)


box
記事: 2002
登録日時: 13年前

Re: malloc関数とポインタ配列についてです

#2

投稿記事 by box » 4年前

コード:

       scnaf("%s", name[i]);
関数名のスペルが間違っているようにしか見えないのですが…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

kazukazukazu
記事: 4
登録日時: 4年前

Re: malloc関数とポインタ配列についてです

#3

投稿記事 by kazukazukazu » 4年前

kazukazukazu さんが書きました:
4年前
文字列を入力してファイルに出力するプログラムを作成したいです。その際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)


kazukazukazu
記事: 4
登録日時: 4年前

Re: malloc関数とポインタ配列についてです

#4

投稿記事 by kazukazukazu » 4年前

こちらの確認不足でした。申し訳ないです。修正したもののやはりうまく行きません

かずま

Re: malloc関数とポインタ配列についてです

#5

投稿記事 by かずま » 4年前

*name = は、name[0] = と同じです。
5回 malloc を呼び出して、5個の領域を確保したのに、
全部 name[0] にポインタが上書きされています。
name[ i] = にしましょう。

free も name に対して、5回実行してください。

かずま

Re: malloc関数とポインタ配列についてです

#6

投稿記事 by かずま » 4年前

かずま さんが書きました:
4年前
free も name に対して、5回実行してください。
free も name[ i] に対して、5回実行してください。

Math

Re: malloc関数とポインタ配列についてです

#7

投稿記事 by Math » 4年前

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

コード:

aaa
bbb
ccc
ddd
eee
バッチファイル cx.bat

コード:

"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\bcc32c" main.c

dir main.exe

main.exe

pause

Math

Re: malloc関数とポインタ配列についてです

#8

投稿記事 by Math » 4年前

本来 課題として与えられたものは可変長配列のような気がするが一応固定長ならこれでいいでしょうね。
詳しくはviewtopic.php?f=3&t=20659
を参考にしてください。

Math

Re: malloc関数とポインタ配列についてです

#9

投稿記事 by Math » 4年前

注:CX-Builderは ソースを UTF-8 で保存しないと日本語が化けます。

返信

“C言語何でも質問掲示板” へ戻る