プロが教えるわが家の防犯対策術!

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';

}

A 回答 (4件)

ざっとしか見てないけど




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関数の中で文字を入力させるのは気持ち悪い。
メインにやらせよう。
    • good
    • 1
この回答へのお礼

今アドバイスを参考に行ったらできました!
ただ文字数制限を10文字にしたくてstr1[10]としたのですが9文字までの時しか成功しません。
文字列について実は勉強してなくて…
この場合 str[9]にぬる文字がはいるということですか?

お礼日時:2022/05/31 01:28

実動にて、動作を確認しました。



getchar()は、画面入力した文字を一文字ずつ取得しますが、
最後にEnterを押すために、末尾に改行コードも取得されてしまいます。

上記の「ゴミ」を取るため、
”for (j=0”の前の行に、
getchar();
を追加してみて下さい。
(Windows系の場合、改行コードはCR+LFなので、2行追加する)

これで思い通りとは行かないまでも、
先に進める動きになると思います。
    • good
    • 0

connect って名前の関数を定義していないからでは?

    • good
    • 2

str1とstr2が文字列入ってないからでしょう。



まずは、
char str1[10] = "abc";
char str2[10] ="123";
などとしてから試してみてください。
    • good
    • 0
この回答へのお礼

それでもうまく行きません…
str1の文字だけ出力されます…

お礼日時:2022/05/30 23:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!