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

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

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

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

配列

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

Q&A

解決済

2回答

2263閲覧

scanfで最初の配列(0)の文字列が格納されない

aluminium

総合スコア7

C

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

配列

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

0グッド

0クリップ

投稿2020/05/20 13:42

初めて質問させていただきます。初心者です。どうぞ宜しくお願いいたします。

「姓名を入れ替えるプログラム」を練習中にタイトルのエラーに遭遇しました。
scanfで入力された最初の配列(0)の文字列だけが格納されず困っています。

例えば、1人目を taro yamada と入力し、2人目を hanako suzuki と入力したとします。
得たい結果は、1人目:yamada taro、2人目:suzuki hanako なのですが、
1人目:ysuzuki thanako、2人目:suzuki hanako となり、1人目だけ表示がおかしいのです。
3人以上入力してもおかしいのは最初の配列だけです。

色々やってみたのですがどうにも解決できず困っています...
お知恵をお借りできれば幸いです。お時間ありがとうございます。

発生している問題

イメージ説明
1人目の姓名が最初の1文字だけしか表示されず、2人目の姓名が入ってきてしまう

該当のソースコード

C

1#include <stdio.h> 2int main() { 3 int num =0; 4 int i; 5 char first[101]; 6 char last[101]; 7 8 scanf("%d", &num);//回数入力 9 10 for(i=0; i<num; i++) {//入力した回数まで名前苗字の入力リピート 11 scanf("%s %s", &first[i], &last[i]); 12 } 13 14 printf("------------\n"); 15 16 for(i=0; i<num; i++) {//入力した回数まで苗字名前の表示リピート 17 printf("%s %s\n", &last[i], &first[i]); 18 } 19 return 0; 20}

試したこと

  • 配列のアドレスが正しいかprintfして確認(されていました)
  • 1つ目のforループ内でprintfして文字列が格納されているか確認(されていました)
  • 2つ目のforループ内の変数名、1つ目と同じものは変える(特に改善しませんでした)

補足情報

このサイトでコンパイルしました。
https://www.onlinegdb.com/online_c_compiler

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

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

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

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

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

guest

回答2

0

for(i=0; i<num; i++) {//入力した回数まで名前苗字の入力リピート
scanf("%s %s", &first[i], &last[i]);
}
となっているので、
最初に入力した名前の 2文字目から文字列を上書きするようになっています。
(3人目になったら、3文字目から)
前に入力した文字列を消さないようにするなどの対応が必要です。
rururu3の様に、2次元配列に入れるのも、一つの対応策になります。
何といっても、何人目のデータか数値で決まってくるので楽です。

ただ、入力した順番に書き出せばいいだけでしたら、
今まで入力した文字列を消したり上書きしたりしなければいいだけなので、
別の方法もありますので、参考にしてください。
ただし、管理が面倒なので、データとして使う場合は他の方法を考えた方がいいですが。

#include <stdio.h> int main() { int num = 0; int i; char first[512]; char last[512]; char *f = first, *l = last; scanf("%d", &num); for (i = 0; i < num; i++) { scanf("%s%s", f, l); while (*f++); while (*l++); } printf("------------\n"); f = first; l = last; for (i = 0; i < num; i++) { printf("%s %s\n", l, f); while (*f++); while (*l++); } return 0; }

または、

#include <stdio.h> int main() { int num = 0; int i; char first[512]; char last[512]; int f = 0, l = 0; scanf("%d", &num); for (i = 0; i < num; i++) { scanf("%s%s", &first[f], &last[l]); while (first[f++]); while (last[l++]); } printf("------------\n"); f = 0; l = 0; for (i = 0; i < num; i++) { printf("%s %s\n", &last[l], &first[f]); while (first[f++]); while (last[l++]); } return 0; }

投稿2020/05/20 14:23

編集2020/05/20 21:54
PingHermit

総合スコア478

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

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

aluminium

2020/05/20 17:58

ありがとうございます!こんなやり方もあるんですね! ポ、ポインタですかこれはもしや... ポインタの理解がまだあやふやなので 復習してから再度拝見させていただきます!取り急ぎ御礼まで。
guest

0

ベストアンサー

ワーニングでまくると思うのですが
説明するのちょっとややこしいのでソース見て理解してください

さくっというと、char first[101];で一つの文字列を格納できますのでそれが入力可能数分確保する必要があります。

c

1#include <stdio.h> 2int main() { 3 int num =0; 4 int i; 5 char first[50][101]; 6 char last[50][101]; 7 8 scanf("%d", &num); 9 10 for(i=0; i<num; i++) { 11 scanf("%s %s", first[i], last[i]); 12 } 13 14 printf("------------\n"); 15 16 for(i=0; i<num; i++) { 17 printf("%s %s\n", last[i], first[i]); 18 } 19 return 0; 20}

投稿2020/05/20 13:51

rururu3

総合スコア5545

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

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

aluminium

2020/05/20 14:07

エラー出ませんでした!意図した出力になりました! こんなに早くご回答いただき... 本当に助かりました。 「入力可能数分確保する」覚えておきます、ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問