ページ 11

ポインタ 配列

Posted: 2015年10月27日(火) 00:35
by ぷち
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define WORD_MAX (10)

int main(void){
int i;
int word_string;
char data_in[WORD_MAX];
char data_out[WORD_MAX];
char *pdata_in;
char *pdata_out;
int j;
int word_string2;
char data_in2[WORD_MAX];
char data_out2[WORD_MAX];
char *pdata_in2;
char *pdata_out2;


printf("%d文字以内で文字列(姓)を入力してください。\n", WORD_MAX);
while(1){
scanf("%s", &data_in);
rewind(stdin);
word_string = strlen(data_in);
printf("入力した文字列(姓)は%dです。\n", word_string);
if (word_string <= WORD_MAX) break;
printf("もう一度入力してください\n");

}
printf("============================================================\n");
pdata_in = &data_in[word_string - 1];
pdata_out = &data_out[0];

for (i = 0; i<word_string; i++)
{
*pdata_out = *pdata_in;
pdata_in--;
pdata_out++;
}
*pdata_out = '\0';


printf("%d文字以内で文字列(名)を入力してください。\n", WORD_MAX);
while(1){
scanf("%s", &data_in2);
rewind(stdin);
word_string2 = strlen(data_in2);
printf("入力した文字列(名)は%dです。\n", word_string2);
if (word_string2 <= WORD_MAX) break;
printf("もう一度入力してください\n");

}
printf("============================================================\n");
pdata_in2 = &data_in2[word_string2 - 1];
pdata_out2 = &data_out2[0];

for (j = 0; j<word_string2; j++)
{
*pdata_out2 = *pdata_in2;
pdata_in2--;
pdata_out2++;
}
*pdata_out2 = '\0';


printf("入力した文字列(姓):%s\n", data_in);
printf("反転した文字列(姓):%s\n", data_out);

printf("入力した文字列(名):%s\n", data_in2);
printf("反転した文字列(名):%s\n", data_out2);


strcat(data_in, data_in2);
strcat(data_out, data_out2);
printf("入力した文字列連結:%s\n", data_in,data_in2);
printf("反転した文字列連結:%s\n", data_out,data_out2);

rewind(stdin);
getchar();
return 0;
}姓と名で10文字以上入力したらデバックでエラーが出るので修正してください。お願いします。

Re: ポインタ 配列

Posted: 2015年10月27日(火) 00:45
by みけCAT
WEBさんのコードとほぼ一致していますが、
WEBさんはscanfを(バッファオーバーランの危険があることおよび戻り値をチェックしていないことを除いて)正しく使用しているのに対し、
ぷちさんは余計な&を2箇所両方に入れる間違いを犯している、という点のみが異なりますね。

万が一同一人物であれば、名前の統一をお願いします。

Re: ポインタ 配列

Posted: 2015年10月27日(火) 23:46
by みけCAT
ぷち さんが書きました:姓と名で10文字以上入力したらデバックでエラーが出るので修正してください。お願いします。

コード:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define WORD_MAX (10)

void read_input(char *s){
	int l = 0;
	for(;;)
	{
		int input = getchar();
		if (input == EOF) break;
		if (isspace(input))
		{
			if (l > 0) break; else continue;
		}
		if (l <= WORD_MAX) s[l++] = input;
	}
	s[l] = '\0';
}

int main(void){
	int i;
	int	word_string;
	char	data_in[WORD_MAX * 2 + 1];
	char	data_out[WORD_MAX * 2 + 1];
	char	*pdata_in;
	char	*pdata_out;
	int	 j;
	int	 word_string2;
	char	data_in2[WORD_MAX + 2];
	char	data_out2[WORD_MAX + 2];
	char	*pdata_in2;
	char	*pdata_out2;


	printf("%d文字以内で文字列(姓)を入力してください。\n", WORD_MAX);
	while(1){
		read_input(data_in);
		rewind(stdin);
		word_string = strlen(data_in);
		printf("入力した文字列(姓)は%dです。\n", word_string);
		if (word_string <= WORD_MAX) break;
		printf("もう一度入力してください\n");

	}
	printf("============================================================\n");
	pdata_in = &data_in[word_string - 1];
	pdata_out = &data_out[0];

	for (i = 0; i<word_string; i++)
	{
		*pdata_out = *pdata_in;
		pdata_in--;
		pdata_out++;
	}
	*pdata_out = '\0';


	printf("%d文字以内で文字列(名)を入力してください。\n", WORD_MAX);
	while(1){
		read_input(data_in2);
		rewind(stdin);
		word_string2 = strlen(data_in2);
		printf("入力した文字列(名)は%dです。\n", word_string2);
		if (word_string2 <= WORD_MAX) break;
		printf("もう一度入力してください\n");

	}
	printf("============================================================\n");
	pdata_in2 = &data_in2[word_string2 - 1];
	pdata_out2 = &data_out2[0];

	for (j = 0; j<word_string2; j++)
	{
		*pdata_out2 = *pdata_in2;
		pdata_in2--;
		pdata_out2++;
	}
	*pdata_out2 = '\0';


	printf("入力した文字列(姓):%s\n", data_in);
	printf("反転した文字列(姓):%s\n", data_out);

	printf("入力した文字列(名):%s\n", data_in2);
	printf("反転した文字列(名):%s\n", data_out2);


	strcat(data_in, data_in2);
	strcat(data_out, data_out2);
	printf("入力した文字列連結:%s\n", data_in);
	printf("反転した文字列連結:%s\n", data_out);

	rewind(stdin);
	getchar();
	return 0;
}