今日明日中に提出をしなくてはならず自らの限界を感じてしまい、
是非皆様のお力をお貸しいただければと思い書き込ませていただきました。
入力した文字列2つを連結して表示させるプログラムを作っています。
出来ない点は
・空白を入力、または何も入力しない場合、注意文を表示させたい。(文字数が多すぎますと同様に)
空白:スペースが入っています。
何もなし:文字を入力してください
・最後の「1か0を入力してください」で数字以外の文字を入力すると無限ループに入ってしまうのを、
「1か0を入力してください」と一行のみ表示させ、再度1か0を入力できるようにしたい。
コードを書き込ませていただきます。是非よろしくお願いいたします。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void input(char in[], int n)
{
printf("%dつ目の文字を入力してください(半角20字、全角6文字以内)\n", n);
scanf("%s", in);
//*
while(!strcmp(in, EOF)){
printf("ちゃんと文字を入力してください\n");
scanf("%s", in);
}
//*/
while(strlen(in) > 20){
printf("文字数が多すぎます.\n");
printf("もう一度文字を入力してください.\n");
scanf("%s", in);
}
}
void joint(char in1[], int n1, char in2[], int n2)
{
//outの関数 文字列の格納
char *out;
int i,j,k;
//ヒープメモリの確保
out = (char *)malloc(sizeof(char) * (n1 + n2 + 1));
//繰り返しで配列 1つ目の文字数終わったら
for(i = 0; i < n1; i++)
out[i] = in1[i];
//空白を入れる
out[i] = ' ';
//2つ目の文字列の配列を入れる
j = i+1;
for(k = 0; k < n2; k++){
out[j] = in2[k];
j++;
}
//2つ目の文字列以降は何も入れない
out[j] = 0;
//outの配列を表示
printf("%s\n", out);
//ヒープメモリの解放
free(out);
}
int main(void)
{
//入力する文字列の長さ
char in1[200],in2[200];
int n1,n2,i,handan;
while(1){
//文字列の初期化
for(i = 0; i < 16; i++){
in1[i] = 0;
in2[i] = 0;
}
//文字列の長さを取得
input(in1, 1);
n1 = strlen(in1);
input(in2, 2);
n2 = strlen(in2);
/*
printf("in1 = %s\n", in1);
printf("in2 = %s\n", in2);
printf("hairetu1 = %d\n", n1);
printf("hairetu2 = %d\n", n2);
*/
//結合した文字列の表示
printf("結合された文字列は\n");
joint(in1,n1,in2,n2);
printf("です\n");
//再度受付 終了受付
printf("もう一度やりますか?\n");
printf("Yesなら1を、Noなら0を入力してください.\n");
scanf("%d" , &handan);
while(handan != 1 && handan != 0){
printf("1か0を入力してください.\n");
scanf("%d", &handan);
}
//0ならループ終了。
if(handan == 0) break;
}
return(0);
}
・文字数を20字にしているにも関わらず全角文字数が10文字ではなく6文字しか入力できない。
(文字コードが関係しており、全角だとバイト数が多く6文字しか入力できないのはわかるが解決策がわからない)
・講師の方に「scanfは使うな」と言われてしまいましたが、scanf以外の処理方法がわからない。
本当にプログラミングの右も左もわからない初心者ですが、何卒ご指摘助言よろしくお願いいたします。