プログラミングCで任意の文字列をずらすプログラムを作成!評価してください!

このQ&Aのポイント
  • プログラミングCで任意の文字列を指定した文字数ずらすプログラムを作成しました。文字列「abc」を1文字ずらすと「bcd」になり、文字列「nisidate」を2文字ずらすと「pkukfcvg」となります。zを1文字ずらしたときはaとします。詳細な処理内容はコードをご確認ください。
  • 入力された文字列とずらす文字数を受け取り、アルファベットを指定した文字数ずらすプログラムをC言語で作成しました。処理の詳細はコードをご確認ください。
  • C言語で任意の文字列を指定した文字数ずらすプログラムを作成しました。処理の詳細はコードをご覧ください。
回答を見る
  • ベストアンサー

作ったプログラミングC何だけど、評価していただけませんが?不足があれば、教えてください!

文字列「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; } よろしくお願いします!!

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答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; } --------------------------------------------------------

lw3695
質問者

お礼

勉強になりました、 詳しくて教えてこころより感謝します!

その他の回答 (4)

回答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; }

lw3695
質問者

お礼

教えれいただいて、本当にありがどうございます!

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

#2のかたがいわれているようにyを2文字ずらした場合が、考慮されていません。 以下、実行結果です。 case1 文字列を入力---> az 何文字ずらすかを入力---> 2 2文字ずらした文字列はcbです これはOKです。 case2 文字列を入力---> ay 何文字ずらすかを入力---> 2 2文字ずらした文字列はcです これは、NGです。

lw3695
質問者

お礼

Thank you very much!

  • aigaion
  • ベストアンサー率47% (287/608)
回答No.2

・str2が閉じられていない(文字列の末尾にNULL文字がない ・入力の制限だとずらす文字数制限はないがこのプログラムだと問題がでるのでは?  例えば,zを1文字ずらせばaは考慮されているが,だが27文字ずらせば?  yを1文字ずらせばzだが,2文字ずらせば?   剰余を使った添字を指定を使えばもう少し簡潔にかけませんか? (25 + 1) % 26 = 0

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

例題の文字列でテストしてみましたか? それから、'z'を特別扱いしている理由は何ですか?

関連するQ&A

  • C言語で分からないところがあるのですが

    すみません。C言語のポインタで分からないことがあって来ました。 ポインタの理屈は理解してはいるのですが、いざソースコードを書いてみようということになると全く手がつけられずにいます。 以下のソースコードですが、strlen()と同じ働きをする関数mystrlen()と、strcmp()と同じ働きをする関数mystrcmpを、ポインタを使って作成するものです。どこをどうすればいいのか教えてくださいませんか。 #include <stdio.h> int main(void) { char str1[80], str2[80]; int i, j; int len1, len2; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /* * 文字列の長さを確認する */ /* NULL文字(文字列の最後)まで読み飛ばす */ for (len1 = 0; len1 < 80 && str1[len1] != '\0'; len1++) ; /* ループ終了後、len1 に文字列の長さが入っている */ if (len1 < 80) { printf("%s は %d 文字の長さです\n", str1, len1); } else { printf ("第1の文字列が80字以上あります\n"); } /* str2 についても同様 */ for (len2 = 0; len2 < 80 && str2[len2] != '\0'; len2++) ; if (len2 < 80) { printf("%s は %d 文字の長さです\n", str2, len2); } else { printf ("第2の文字列が80字以上あります\n"); } if (len1 < 80 && len2 < 80) { for (i = 0; i < 80 && str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i]; i++) ; if (str1[i] == str2[i]) { /* 両者同時に == '\0' のはず*/ printf("文字列は等しい\n"); } else if (str1[i] < str2[i]) { /* str1[i] == '\0' のはず*/ printf("%s は %s より小さい\n", str1, str2); } else { /* str2[i] == '\0' のはず*/ printf("%s は %s より大きい\n", str1, str2); } } /* * 十分なスペースがあれば、str2をstr1の最後に連結する */ if (len1 + len2 < 80) { /* str1 の末尾を探す */ for (i = 0; str1[i] != '\0'; i++) ; /* ループを抜けた段階では i は len1 と同じはずなので、 上記のループを作らず、i の代わりに len1 を用いるのも可 */ /* それ以降に str2 の中身をコピーする */ for (j = 0; str2[j] != '\0'; j++) { str1[i+j] = str2[j]; } str1[i+j] = '\0'; printf("%s\n", str1); } else { printf ("文字列をつなげた長さが80字以上あります\n"); } /* * str2をstr1にコピーする */ if (len1 + len2 < 80) { for (i = 0; str1[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0'; printf("%s %s\n", str1, str2); } return 0; }

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • 大学のプログラミング課題について

    大学でプログラミングの課題が出たのですが、よくわからないので 詳しく教えてほしいです。 問題 99文字までの文字列を入力し,アルファベットの小文字は大文字に,アルファベットの大文字は小文字に,またアルファベット以外の文字はアスタリスク’*’に変換した文字列を出力するプログラムを作成せよ 実行結果は 99文字以下の文字列を入力してください.abcABC123sDFgh#"x32YY= 変換された文字列はABCabc***SdfGH**X**yy*です. というようになるはずなのですが、うまくいきません。 私が考えたのは #include <stdio.h> int main(void) { int i,j; char t[100],u; printf("99文字以下の文字列を入力してください"); scanf("%s",t); printf("変換された文字列は"); for(i=0;t[i]>0;i++); { } for(j=0;j<=i;j++); { if(t[j]>=65 && t[j]<=90) { u=t[j]+32; printf("%c",u); } else if(t[j]>=97 && t[j]<=122) { u=t[j]-32; printf("%c",u); } else { u='*'; printf("%c",u); } } printf("です\n"); } というものです。 ちなみに、他のライブラリ関数は使わないで作らないといけません。 どこが間違っているのかも含めて 教えていただけると嬉しいです。

  • アルファベットを入力するとすべてのアルファベットを小文字に変換して出力

    アルファベットを入力するとすべてのアルファベットを小文字に変換して出力するプログラムを作成しました。2度以上同じ処理を行う場合はその部分を関数としなければいけないのですが、実行結果のように出力できませんでした。。どこが間違っているのでしょうか? 実行結果↓ ************ AOmori ==>aomori iwate ==>iwate AKITA ==>akita ************ #include <stdio.h> #include <string.h> #include <ctype.h> int henkan(void); int main(void) { char str[100]; int j,len; for(j=0;j<6;j++){ gets(str); printf("==>"); } henkan(); return 0; } int henkan(void) { char str[100]; int i, chk,len; for(i=0;i<len;i++){ chk=isupper(str[i]); if(chk!=0)str[i]=tolower(str[i]); { printf("%c",str[i]); } } printf("\n"); return chk; }

  • シーザー暗号(C言語)

    シーザー暗号というものを作ろうとしていますが、文字のずらし方がわからず詰まっています。 手順は一応考えてあります。 (1)入力された文字を配列input[301]に代入 (2)何文字ずらすかを指定してその数値を変数countに代入 (3)入力された文字の長さを変数lenに代入 (4)inputとcountとlenを、文字をずらしてそれをoutputに返す関数shiftに渡す (5)outputを表示する のような感じですが、肝心の文字のずらし方がわかりません。 JISコードを使ってやるといいと聞いたんですが、そのやり方がわかりません。 ソース↓ #include <stdio.h> #include <string.h> int shift_char(char x[], int y, int z) { int i; for(i = 0; i <= z; i++) { x[i] = x[i] + y; } return x; } int main(int argc, char* argv[]) { char input[301]; char output[301]; int count, len, i; printf("文字を入力してください: "); scanf("%s" ,input); printf("何文字ずらしますか: "); scanf("%d" ,count); len = strlen(input); output = shift_char(input, count, len); for(i = 0; i <= len; i++) { printf("%s" ,output[i]); } return 0; } よろしくお願いします。

  • C言語プログラミング 初心者

    現在2つの文字列を比較するstrcmp()関数と同じ動作をするプログラムを制作しています。 もちろん、strcmp()は一切用いません。 何とか作ってみたものの、文字列が等しいときなどにはうまく作動しません。 分かる方アドバイスお願いします。 以下のプログラムでは2つの50文字以下の文字列を入力することを想定しています。 #include<stdio.h> int main(void) { char str1[50],str2[50]; int a,b,i; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /*文字列の長さを確認します*/ for(a = 0;str[a];a++) ; for(b = 0;str2[b];b++) ; printf("%s ha %d mozinonagasadesu\n",str1,a); printf("%s ha %d mozinonagasadesu\n",str2,b); /*文字列を比較します*/ for(i = 0;;i++){ if(str1[i] > str2[i]) printf("%s は %s より大きい\n"str1,str2); else if(str1[i] < str2[i]) printf("%s は %s より小さい\n"str1,str2); if(str1[i] > str2[i] || str1[i] <str2[i]) break; } for(i=0;str1[i] && str2[i];i++) if(str1[i] == str2[i] ) printf("文字列は等しい\n"); /*上のプログラミングだとstr1がaab、str2がaacのときも文字列が等しいと表示してしまうので、ぴったり等しいときのみ表示するにはどのように条件付けしたらよいでしょうか?*/ return 0; } ちなみにstr1[0]=a ,str1[1]=b, str2[0]=a, str[1]=b, str[2]=cが格納されていた場合、str1 < str2になると思うのですが正しいでしょうか? もし正しければこの場合str1[2]にはヌル文字が入っており、それがstr2[2]のcと比較されたためなのでしょうか? いろいろと質問してしまいましたが、分かる方解答お願いします。

  • cプログラミングについて

    以下はsample.txtというファイルを読み込み、辞書順に並べるプログラミングですが、どう正しく 直したらよいかわかりません。間違っている場所を指摘していただけたらと思います。 (間違えだらけで申し訳ありません) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 500 void mysort(char *word[MAXLINE]) { int i,j; char *tmp; for(i=0;;i++){ for(j=i+1;; j++){ if(strcmp(word[j],word[i])==1){ tmp=word[i]; word[i]=word[j]; word[j]=tmp; } } } } int main(void) { int i; FILE *fp; char str[MAXLINE]; fp= fopen("sample.txt", "r"); if (fp == NULL) { printf("fopen error\n"); exit(1); } while(( fgets( str, MAXLINE, fp )) != NULL) mysort(str); for(i=0;; i++) printf("%s\n", str[i]); return 0; }

  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • 文字列

    下のプログラムは何をするためのプログラムなのか教えてください。 個人的にはJISコードに関係していると思うのですがさっぱりわかりません。 どなたか詳しい説明お願いします。 #include <stdio.h> #define LEN 255 int main(void) { char str[LEN]; char cipher[LEN]; int ikey; int i,n; printf("文字列を入力せよ : "); scanf("%s", str); printf("鍵を入力 : "); scanf("%d", &ikey); i = 0; while (str[i]!='\0') { n = (str[i]-'A'+ikey)%26; cipher[i] = 'A'+n; ++i; } cipher[i] = '\0'; printf("%s\n", cipher); return 0; }

専門家に質問してみよう