C言語のプログラミング:255文字以内の文字列を処理する方法

このQ&Aのポイント
  • C言語のプログラミングで、255文字以内の文字列をキーボードから入力し、特定の処理を行う方法について教えてください。
  • 具体的には、入力した文字列の最後の文字を出力する方法、入力した文字列を逆に並べ替えて出力する方法、入力した文字列を縦に出力する方法(1文字ずつ表示)、および入力した文字列の中に含まれる「F」の個数を調べる方法について知りたいです。
  • ただし、使用できるのはfor文・配列・if文のみで、それ以上の高度な機能は使用しないでください。
回答を見る
  • ベストアンサー

C言語のプログラミングですが、

C言語のプログラミングですが、 255文字以内の文字列をキーボードから入力して、下記の各処理を行うプログラム(※入力した文字データは配列に入力)はどのようにしたらいいでしょうか?(入力例:acFNkeexFFg) ・入力した文字列の最後の文字を出力 ・入力した文字列⇒逆に並べ替えて出力 ・入力した文字列⇒縦に出力(1文字ずつ) ・入力した文字列の中に「F」が何個あるか ただし、使えるのはfor文・配列・if文ぐらいでそれ以上レベルの高いものは使わないで下さい。 … char str[255]; int i,n,na,nb,nc; printf("Input Strings= "); scanf("%s",str); for(i=0;str[i]!='¥0';i++){ n=i; } printf("The last character= %c",str[n]); くらいまでしか分かりません…

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

  • ベストアンサー
  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

こんな感じ…。 #include <stdio.h> void main(){  char str[256];  int i,n,na,nb,nc;  printf("Input Strings = ");  scanf("%s",str);  na = 0;  for(i=0;str[i] != '\0';i++){   if(str[i]=='F')na++;   n=i;  }  printf("The last character = %c\n",str[n]);  printf("The Reverse character = ");  for(i=n;i>=0;i--){   printf("%c",str[i]);  }  printf("\n");  printf("The Vertical character is\n");  for(i=0;i<=n;i++){   printf("%3d:%c\n",i,str[i]);  }  printf("Occurrence count of F is %d\n",na); } ※全角スペースを使用しているので修正してね。

komatulong
質問者

お礼

ご回答ありがとうございます。 分かりやすいプログラムをご丁寧に教えていただいて嬉しいです。 配列などの細かな仕組みを理解するために、いろいろと参考にさせていただきます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「for文・配列・if文ぐらい」と「それ以上レベルの高いもの」はどのように線をひけばいいんでしょうか. ただ, まじめにやると「255文字以内の文字列をキーボードから入力する」だけでも非常に難しいですね. 以下余談なんだけど.... 実は, ここで「プログラム全体」を書いてもらったとしても, それを「レポートなりなんなりの解答」として出すのは著作権法上まずいんじゃないかなぁと思ったりする.

komatulong
質問者

お礼

ご回答ありがとうございます。 確かに全部を訊くのは少し卑怯な方法かもしれませんね。 今度からは解くヒントなどを教えてもらおうと思います。

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

>下記の各処理を行うプログラム(※入力した文字データは配列に入力)はどのようにしたらいいでしょうか?(入力例:acFNkeexFFg) >ただし、使えるのはfor文・配列・if文ぐらいでそれ以上レベルの高いものは使わないで下さい。 プログラムを作るのはあなたですか?誰ですか? 後の文が「レベルの高いものは使えないことになっています。」なら、 あなたがプログラムを作ることになっている、とわかるのですが。 「使わないでください」って書かれると、「作ってもらったプログラムを 課題の答えか何かとしてそのまま提出します」ってニュアンスが感じ取れます。

komatulong
質問者

お礼

ご回答ありがとうございます。 ここで教えてもらったプログラムを参考に、大まかな仕組みを理解しようと思っていたのですが その事を書いていませんでした。 申し訳ありません。これからは質問文に目的を書くようにします。

関連するQ&A

  • 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言語の問題で困っています。

    C言語の問題で困っています。 途中までできたのですが、この先が分かりません。 教えて頂くようお願いいたします。 【問題】 文字列の長さを求めるプログラムです。このプログラムを、入力した文字列の文字列長を求めるように変更してみましょう。  ただし、入力する文字列は半角で最大 20 文字までとし、指定された範囲外の値( 21 以上)が入力された場合は、正しい値が入力されるまで入力処理を繰り返すこと。 #include <stdio.h> int main(void) { char str[256] = "Hello"; int length, i; printf("文字列:"); scanf ("%s",str); length=0; i=0; while (str[i]!='\0') { i++; length++; } printf("\n文字列長:%d\n",length); }

  • 作ったプログラミング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; } よろしくお願いします!!

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • 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言語 この記述のどこが間違っているのでしょうか?

    最大10文字の文字列入力を受け付け、 10回入力するか、「OK」が入力された時に 文字列を出力するプログラムを作ろうと思い、 その中で、1回目に『OK』が入力された時には、エラーメッセージを表示して終了するようにしたいのですが、 以下を入力したところ、うまく動作しませんでした。(見づらいのはご容赦ください) 制御文と配列を使って動作させるには、どう修正するべきでしょうか。 初心者ですが、ご教授お願い致します。 #include <stdio.h> #define MAX_INP 10 /* 入力最大回数 */ #define MAX_LGTH 5 /* 入力可能最大文字数 */ int main(void) { char str[MAX_INP][MAX_LGTH]; int cnt; /* 入力用カウンタ */ printf("\n"); for(cnt = 0 ; cnt < MAX_INP ; cnt++) /* 入力ループ */ { printf("Input String. -> "); /* 文字列入力メッセージ */ scanf("%s",&str[cnt][0]); /* 文字列入力 */ if(str[cnt][0]=='O' && str[cnt][1]=='K' && str[cnt][2]=='\0') { /* OKと入力された場合 */ break; /* ループから抜ける */ } if(cnt == 0) /*「OK」入力が1回目の場合 */ { printf("Error."); /* エラーメッセージ */ return 0; } } printf("\n"); for(cnt = 0 ; cnt < MAX_INPUT ; cnt++) /* 出力ループ */ { printf("%s\n",&str[cnt][0]); /* 文字列出力 */ } printf("\n"); return 0; } 【動作結果1】 Input string. -> abc Error. > 【動作結果2】 Input string. -> OK OK Uウ@ @ ■p 『 『 >

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

    XP環境でVisual C++2008を使ってC言語の プログラミングをしています。 キーボードから複数回読み込み、長い文字列を作るというものです。 例) >>文字列を入力 >>abc >>今まで入力された文字列を表示 >>gsfgsdfgjfsdabc 配列、ポインタ、メモリの確保を行う事がヒントとして与えられています。 これを実現するために以下のようなプログラムを組んでみました。 int InputCount=0; char InputStr[10]; char *OutputStr[5]; int i=0; while(InputCount<5){ printf("文字列を入力してください\n"); scanf("%s",InputStr); OutputStr[InputCount]=(char*)malloc(strlen(InputStr)+1); OutputStr[InputCount]=InputStr; printf("今までに入力された文字を表示します\n"); for(i=0;i<=InputCount;i++){ printf("%s",OutputString[i]); } printf("\n"); InputCount++; } このように組んでみたのですが、うまくいきませんでした。 これでは一度入力した文字列の内容を 保持する事ができないようです。 根本的にアルゴリズムが悪いのではないかとも考えていますが、どうするのが良いのかわかりません。 初心者なので至らない点、情報不足があればご指摘願います。 これではなぜ無理なのか、またどのようなアプローチが良いのかご教授よろしくお願いします。

  • 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の行がたぶん間違っていると思うんですが。。。

  • プログラミングC

    以下に示すプログラムは、キーボードから39文字以下の文字列を入力した後で、その文字列を表示するプログラムである。ただし、文字列の表示においては、printf命令における変換指定で、%sを使用するのが一般的であるが、以下のプログラムあえて%sを使用せずに、%cを使っている。このプログラムについてキーボードから入力される文字列の文字数が391文字以下である限り、その文字列を正しく表示できるよう、下線部を埋めてプログラムを完成させなさい。 char x[40],i printf("39文字以下の文字列を入力:"); scanf("%s",x); for(i=0;x[i]_____;i++) printf("%c",x[i]); printf("です。\n"); [実行例] 39文字以下の文字列を入力:programming 入力された文字列はprogrammingです。

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

専門家に質問してみよう