質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3945閲覧

変数 文字列 配列代入

ritsu.m

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/01/24 16:40

変数に入っている文字列を配列に代入したい

テキストファイルのデータを読み込み読み込んだ値を処理して出力するというプログラムを作っています。
読み込んだ値を変数に代入するところまではできたのですが、その変数に入った文字列を配列に代入する機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

aaa.c:45:17: error: array type 'char [128]' is not assignable
name[i] = str;

###実現したいこと
配列nameにファイルから読み込んだ8個の文字列を代入したい

該当のソースコード

#include<stdlib.h> #define NO 8 void bubblesort(int numbers[],int array_size) { int i,j,temp; for(i=0;i<(array_size-1);i++){ for(j=(array_size-1);j>i;j--){ if(numbers[j-1]>numbers[j]){ temp=numbers[j-1]; numbers[j-1]=numbers[j]; numbers[j]=temp; } } } } -------------------------------------------------------------------ここから下です int main(void){ FILE *fp; int i; char str[20]; int f1; int f2; int f3; int f4; int s[NO]; int bc; char name[NO][128]; fp = fopen("uuuo.txt","r"); if(fp == NULL){ printf("ファイルオープン失敗\n"); return -1; } for(i=0;i<NO;i++){ fscanf(fp, "%d,%c,%d,%d,%d", &f1, str ,&f2, &f3, &f4); bc=(f2+f3+f4)/3; s[i]=bc; printf("%d",s[i]); name[i] = str; printf("%s",name[i]); } return 0; }

###利用環境
ソフト  vusual stdio code
pc   mac

分かる方、回答の方よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amura

2020/01/25 10:47

bubblesortが気になって #include<stdio.h> #include<stdlib.h> #include<string.h> #define NO 8 struct rec_dt { int f1; char name[128]; int f2; int f3; int f4; int ave; }; struct rec_dt rec[NO]; void bubblesort(struct rec_dt numbers[],int array_size) { int i,j; struct rec_dt temp; for(i=0;i<(array_size-1);i++){ for(j=(array_size-1);j>i;j--){ if(numbers[j-1].ave>numbers[j].ave){ temp=numbers[j-1]; numbers[j-1]=numbers[j]; numbers[j]=temp; } } } } int main(void){ FILE *fp; int i; char str[21]; int f1; int f2; int f3; int f4; int bc; fp = fopen("uuuo.txt","r"); if(fp == NULL){ printf("ファイルオープン失敗\n"); return -1; } for(i=0;i<NO;i++){ fscanf(fp, "%d,%20[^,],%d,%d,%d\n", &f1, str ,&f2, &f3, &f4); bc=(f2+f3+f4)/3; rec[i].ave=bc; rec[i].f1=f1; strcpy(rec[i].name, str); rec[i].f2=f2; rec[i].f3=f3; rec[i].f4=f4; } for(i=0;i<NO;i++){ printf("%d %d %s %d %d %d\n",rec[i].ave, rec[i].f1, rec[i].name, rec[i].f2, rec[i].f3, rec[i].f4); } bubblesort(rec, NO); printf("..sorted..\n"); for(i=0;i<NO;i++){ printf("%d %d %s %d %d %d\n",rec[i].ave, rec[i].f1, rec[i].name, rec[i].f2, rec[i].f3, rec[i].f4); } return 0; }
guest

回答2

0

ベストアンサー

Cでは、文字列のコピーが代入ではできません。
strcpy を使ってください。
文字列を読み込むのは %s ですが、
これでは区切りの ',' も文字列として読み込まれてしまいます。
%[^,] が必要でしょう。

C

1#include <stdio.h> 2#include <string.h> // strcpy 3 4#define NO 8 5 6int main(void) 7{ 8 char str[128]; 9 int f1, f2, f3, f4; 10 int s[NO]; 11 char name[NO][128]; 12 13 FILE *fp = fopen("uuuo.txt", "r"); 14 if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } 15 16 for (int i = 0; i < NO; i++) { 17 fscanf(fp, "%d,%127[^,],%d,%d,%d", &f1, str ,&f2, &f3, &f4); 18 s[i] = (f2 + f3 + f4) / 3; 19 strcpy(name[i], str); 20 printf("%d %s\n", s[i], name[i]); 21 } 22 fclose(fp); 23 return 0; 24}

質問を編集して、入力データを追加してください。

投稿2020/01/24 17:21

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ritsu.m

2020/01/25 09:50

strcpyを使う、、 なるほど、ありがとうございます!
kazuma-s

2020/01/25 15:40

入力データの例と期待する出力結果を提示してください。 そうでないと検証できません。
ritsu.m

2020/01/26 09:57

次に質問するときにそうするようにします!
guest

0

fscanf(fp, "%d,%c,%d,%d,%d", &f1, str ,&f2, &f3, &f4);


fscanf(fp, "%d,%s,%d,%d,%d", &f1, str ,&f2, &f3, &f4);

name[i] = str;

文字列は直接代入できません。
strcpy()を使いましょう。

投稿2020/01/24 17:00

編集2020/01/24 17:10
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/01/24 17:12 編集

%cは1文字です。%sにして文字列を読み込みましょう。 ちなみに、uuuo.txtはcsv(カンマ区切り)ですよね? scanf()系は、エラーチェック(読み込んだ項目数)したほうがいいですよd^^
ritsu.m

2020/01/25 09:50

1文字、 忘れていました! エラーチェックします! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問