
文字列「abc」の各アルファベットを1文字ずらすと文字列「bcd
」になり、
文字列「nisidate」の各アルファベットを2文字ずらすと文字
列「pkukfcvg」となる。さらに、
文字列「kibishii」の各アルファベットを2文字ずらすと文字
列「mkdkujkk」となる。
このような、任意の文字列の各要素を任意の文字数ずらすプロ
グラムを作成する、なお、zを1文字ずらしたとき
のアルファベットはaとする。
#include <stdio.h>
#include <string.h>
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++)
{
for(j=0;j<27;j++)
{
if(str1[i]=='z')
{
str2[i]=str[x-1];
}
if(!(str1[i]=='z'))
{
if(str1[i]==str[j])
{
str2[i]=str[j+x];
}
}
}
}
printf("%d文字ずらした文字列は%sです\n", x, str2);
return 0;
}
よろしくお願いします!!

No.4ベストアンサー
- 回答日時:
#3です。
指摘だけでも、不親切なので。
以下、模範解答。
修正点は以下の通り。
ずらしの文字は、右側だけだが、左側にも対応。(左側の場合、マイナスの値を指定)
ずらじの文字数が、26以上でも対応する。2600のずらし等もOK。
zの文字のみを特殊な扱いにしない。yを2文字ずらして、aになるようにする。
以下ソース。
---------------------------------------------
#include <stdio.h>
#include <string.h>
//shfit_count :ずらし数(26以上を許す)負の数でも良い
//char_in :入力文字(1文字)
//戻り値:ずらした結果の1文字
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;
}
//入力文字がa~z以外ならaとみなす
if (i == 26) i = 0;
//ずらした後の文字の位置を求める。26の余りを求めるのは、26以上のずらしに対応するため
j = (i + shift_count)%26;
//左へのずらしに対応する
if (j < 0) {
j += 26;
}
//これで 0<=j<=25であることが保証されるので、この位置の文字を返す
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;
}
--------------------------------------------------------
No.5
- 回答日時:
#include <stdio.h>
void shift(const char *s1, char *s2, int n)
{
char *a = "abcdefghijklmnopqrstuvwxyz";
int i, j;
if(n < 0) n = 26 - (-n % 26);
for(j = 0; s2[j] = s1[j]; j ++){
for(i = 0; i < 26; i ++){
if(s2[j] == a[i]){
s2[j] = a[(i + n) % 26];
break;
}
}
}
}
int main(void)
{
char s1[64], s2[64];
int n;
printf("文字列を入力---> ");
scanf("%63[^\n]%*[^\n]%*c", s1);
printf("何文字ずらすかを入力---> ");
scanf("%d", &n);
shift(s1, s2, n);
puts(s2);
return 0;
}

No.3
- 回答日時:
#2のかたがいわれているようにyを2文字ずらした場合が、考慮されていません。
以下、実行結果です。
case1
文字列を入力---> az
何文字ずらすかを入力---> 2
2文字ずらした文字列はcbです
これはOKです。
case2
文字列を入力---> ay
何文字ずらすかを入力---> 2
2文字ずらした文字列はcです
これは、NGです。
No.2
- 回答日時:
・str2が閉じられていない(文字列の末尾にNULL文字がない
・入力の制限だとずらす文字数制限はないがこのプログラムだと問題がでるのでは?
例えば,zを1文字ずらせばaは考慮されているが,だが27文字ずらせば?
yを1文字ずらせばzだが,2文字ずらせば?
剰余を使った添字を指定を使えばもう少し簡潔にかけませんか?
(25 + 1) % 26 = 0
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
Cで「大文字、小文字の判定」は...
-
C言語 strlen 再入力を促す
-
itoaわかりません
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
2進数、16進数、10進数のことを...
-
複数桁10進数の*桁目だけを抽出...
-
エクセルで可視セルにのみ値貼...
-
20'(角度)の計算がわかりま...
-
C言語での引数の省略方法
-
DWORDの実際の型は何でしょうか
-
ある商品のロス率を5%見込み、...
-
「指定されたキャストは有効で...
-
c languageで 簡単な質問があ...
-
マイナスからプラスへ転じた時...
-
float型とdouble型の変数の違い...
-
プログラムでの数字につく”f”の...
-
std::set<int> で、ある値が何...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
itoaわかりません
-
fgetsで拾われる改行文字を削除...
-
Cで「大文字、小文字の判定」は...
-
反転した数値を表示させるやり方
-
fgets関数を使用したときの文字...
-
1行の文字列を時間差で表示する...
-
charと%c , %s の関係について
-
文字列中に含まれる文字の個数...
-
CStringについて
-
[Java]文字列分割
-
C言語 空白の行(改行のみ)が...
-
C言語のステップ数をカウントす...
-
strstrを利用しない文字列検索...
-
エディットボックスに入力され...
-
ブランクのチェック
-
日本語の変換の問題
-
C言語の課題です
-
C言語で16進数文字列から16進数...
おすすめ情報