ページ 11

文字列を指定した数だけずらす

Posted: 2015年11月15日(日) 21:41
by さおり
文字列を指定した数だけずらすプログラムを作成しているのですが、おそらく初歩的な考えなのかもしれませんが、どうしてもa~zとA~Z以外の文字を入力したときにそのまま出力することが出来ません。
よろしくお願いします。

コード:

#include <stdio.h>
#include <string.h>

char shift_char(int shift_count, char char_in)
{
	char str[27] = "abcdefghijklmnopqrstuvwxyz";
	int i, j;
	
	for (i = 0; i < 26; i++){
		if (char_in == str[i]) break;
	}
	
	j = (i + shift_count) % 26;
	
	if (j < 0) {
		j += 26;
	}
	return str[j];
}
int main(void)
{
	char str[27] = "abcdefghijklmnopqrstuvwxyz", str1[50], str2[50];
	int x, i, j, len;

	printf("文字列を入力---> ");
	scanf("%s", str1);

	printf("何文字ずらすかを入力---> ");
	scanf("%d", &x);

	len = strlen(str1);

	for (i = 0; i<len; i++)
	{
		str2[i] = shift_char(x, str1[i]);
	}
	//終端にNULLを付加する
	str2[i] = '\0';
	printf("%d文字ずらした文字列は%sです\n", x, str2);

	return 0;
}

Re: 文字列を指定した数だけずらす

Posted: 2015年11月15日(日) 21:46
by みけCAT
さおり さんが書きました:文字列を指定した数だけずらすプログラムを作成しているのですが、おそらく初歩的な考えなのかもしれませんが、どうしてもa~zとA~Z以外の文字を入力したときにそのまま出力することが出来ません。
よろしくお願いします。
a~zとA~Z以外の文字を入力したときにそのまま出力する処理を追加すればいいでしょう。

コード:

char shift_char(int shift_count, char char_in)
{
	char str[27] = "abcdefghijklmnopqrstuvwxyz";
	int i, j;
	
	for (i = 0; i < 26; i++){
		if (char_in == str[i]) break;
	}
	if (i >= 26) return char_in; /* この行を追加する */
	
	j = (i + shift_count) % 26;
	
	if (j < 0) {
		j += 26;
	}
	return str[j];
}
オフトピック
アルファベットの文字コードは連続していないかもしれないので、単純な

コード:

return 'a'<=char_in && char_in<='z' ? ((char_in+shift_count)%26+26)%26 : char_in;
という実装ではいけません。

Re: 文字列を指定した数だけずらす

Posted: 2015年11月15日(日) 22:03
by box
さおり さんが書きました:文字列を指定した数だけずらすプログラム
入力と出力の例を挙げてください。