

c言語配列の結合についてです。
なぜうまくいかないのでしょうか。
#include <stdio.h>
void connect(char* str, char* str1, char* str2, int len1, int len2);
void main(void)
{
char str[20];
char str1[10] ;
char str2[10] ;
int len1, len2;
printf("文字の数を入力してください str1:");
scanf("%d", &len1);
printf("文字の数を入力してくださいstr2:");
scanf("%d", &len2);
connect(str, str1, str2, len1, len2);
printf("result = %s\n", str);
}
void concect(char* str, char* str1, char* str2, int len1, int len2)
{ int i,j,ch1,ch2;
int k = 0;
int l = 0;
for (i = 0; i < len1 - 1 && (ch1 = getchar()) != '\n'; i++)
str1[i] = ch1;
str1[i] = '\0';
for (j = 0; j < len2 - 1 && (ch2 = getchar()) != '\n'; j++)
str2[j] = ch2;
str2[j] = '\0';
while (str1[k] != '\0') {
str[k] = str1[k];
k++;
}
while (str2[l] != '\0') {
str[k + l] = str2[l];
l++;
}
str[k + l] = '\0';
}
No.3ベストアンサー
- 回答日時:
ざっとしか見てないけど
①
scanf("%d", &len2) は 改行を読まないので、次の getchar() が
改行を読みに行ってしまう。scanf あるあるなので注意。
scanf("%d%c", &len2, &dummy)
で読み飛ばせばよいが、素直に fgets, sscanf の方が良い。
上限チェックも欲しいな。
②
for (i = 0; i < len1 - 1 && (ch1 = getchar()) != '\n'; i++)
これも3文字といれて3文字打つと、
改行が次の for へ行って意図しない動きになる。
文字が多すぎて切るのは良いが、改行までしっかり
読み込まないと後続の処理がおかしくなる。
③
関数名打ち間違い。
concect → connect
concat が良いと思うけどね。
④
バグではないが、
connect関数の中で文字を入力させるのは気持ち悪い。
メインにやらせよう。
今アドバイスを参考に行ったらできました!
ただ文字数制限を10文字にしたくてstr1[10]としたのですが9文字までの時しか成功しません。
文字列について実は勉強してなくて…
この場合 str[9]にぬる文字がはいるということですか?
No.4
- 回答日時:
実動にて、動作を確認しました。
getchar()は、画面入力した文字を一文字ずつ取得しますが、
最後にEnterを押すために、末尾に改行コードも取得されてしまいます。
上記の「ゴミ」を取るため、
”for (j=0”の前の行に、
getchar();
を追加してみて下さい。
(Windows系の場合、改行コードはCR+LFなので、2行追加する)
これで思い通りとは行かないまでも、
先に進める動きになると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
getchar()を int でとる理由...
-
for文 アスタリスクで形を作る
-
間接参照のレベルが異なっています
-
'const char *' 型は 'char *' ...
-
コマンドラインに入力されてい...
-
ネットワークにつながっている...
-
atoi( ) の反対をやりたい
-
ワイルドカードを用いた文字列検索
-
配列から指定するデータを取り...
-
標準ライブラリ関数の自作につ...
-
charからLPTSTRへの変換方法
-
あるシーケンスに含まれるある...
-
RGB→YUV変換のプログラム
-
c言語
-
アドレスの中身を参照する方法
-
strcmp と strcpy の使い方で疑問
-
4バイトでのサムチェックコー...
-
干支のプログラム
-
strncpyと_tcsncpy_sのヌルの扱...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
WORDをcharに変換する方法
-
strncpyと_tcsncpy_sのヌルの扱...
-
型変換
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
Win32APIでのエディットボック...
-
間接参照のレベルが異なっています
-
c言語配列の結合についてです。...
-
【C言語】テキストファイル内の...
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
C言語のfor文です。 繰り返しの...
おすすめ情報