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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
さおり

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

#1

投稿記事 by さおり » 8年前

文字列を指定した数だけずらすプログラムを作成しているのですが、おそらく初歩的な考えなのかもしれませんが、どうしても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;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 8年前

さおり さんが書きました:文字列を指定した数だけずらすプログラムを作成しているのですが、おそらく初歩的な考えなのかもしれませんが、どうしても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;
という実装ではいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

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

#3

投稿記事 by box » 8年前

さおり さんが書きました:文字列を指定した数だけずらすプログラム
入力と出力の例を挙げてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る