文字を入れ替える方法とは?

このQ&Aのポイント
  • 文字を入れ替える方法について教えてください。
  • 質問文章について要約すると、文字を入れ替える方法を知りたいという内容です。
  • また、質問文章のコードを見やすく修正してほしいとのことです。
回答を見る
  • ベストアンサー

文字を入れ替える

abcdefacdeeabとあるとします。 abと文字が来るときだけabを++に置き換えたいのです。 aだけ変えるのを考えたのですが bがある場合は+ とbがない場合はaも変えない と言うのが考えつきません。 char *a; int i; fgets=(moji,100,stdin); *a=moji[100]; for( i = 0 ; ; i++ ) { if( *(a+i) == 'a' ) { moji[i]='+'; else { moji[i]=*( a + i ); } if(*( a + i ) == '\0'); break; } 見にくいですがよろしくお願いします。

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

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.3

#2さんの改良。BM法っぽくして同じ文字を2度見るのをやめてスピードアップ。  char *a , moji[100];  fgets(moji,100,stdin);  a = moji ;  if (*a != 0) {   for(;*(a+1) !=0 ;a++ ) {    if( *a == 'a' ) {     if ( *(a+1) == 'b') {      *a = '+' ;      *(a+1) = '+' ;     }    } else {     a++;    }   }  }

その他の回答 (2)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

 char *a , moji[100];  fgets(moji,100,stdin);  a = moji ;  if (*a != 0) {   for(;*(a+1) !=0 ;a++ ) {    if( *a == 'a' && *(a+1) == 'b') {     *a = '+' ;     *(a+1) = '+' ;    }   }  } 二文字位ならハードコーディングでも問題無いと思う。

回答No.1

#include <stdio.h> #include <string.h> int main() {  char data[] = "abcdefacdeeab";  char* position = data;  while ( position = strstr(position,"ab") ) {   *position++ = '+';   *position++ = '+';  }  puts(data);  return 0; }

関連するQ&A

  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

  • 決まった文字の数を数える

    数を数えるプログラミングをしています。 あるきまった文字だけをカウントして、その出現回数だけを数えたいのです。 途中まで考えてみたのですが、決まった文字が出現するとこでどうしたらいいか分からなくなりました。 できるだけ自分でやりたいと思ってるので、使える関数や続きの考え方を教えてもらえるとうれしいです。 初心者なのでよろしくお願いします。 a後にbが来たときだけを数えるものです。 char *a; int i; moji[20] //abcddcbaが入っている a = moji; /*ここから下を考えてる途中*/ if( *a != 0 ) { for(;*( a+1) != 0; a++ ) { if( *a == 'a' ) { if( *(a+1) == 'b' ) {

  • c言語 文字列と配列

    #include<stdio.h> int charlen(int n); void cap2sml(int b); int main() { char a[100],b[100]; int n,i; /*Input CARACTERS*/ printf("CAPITAL?\n"); fgets(a,100,stdin); charlen(n); printf("total cahrs=%d\n",n); //printf in main cap2sml(i); printf("small=%s\n",b); return(0); int charlen(int n) n=0; while(1){ if(a[n]=='\0') break; n++; } void cap2sml(int b) int i; for(i=0;a[i]!='\0';i++){ b[i]=a[i]+0x20; } b[i]='\0' } のプログラムでエラーがでるのですが、どこを直せばよいでしょうか? ユーザー関数を使い文字列(大文字)を入力したときの文字列の長さと大文字を小文字に変化するプログラムです

  • 配列とポインタを使って特定の文字だけ大文字にする

    配列とポインタを使って特定の文字だけ大文字にするプログラムを作りたいのですがどのように作ればいいのでしょうか? 例えば、sportsのsだけ判別してSportSというふうにしたいです。 一応以下のようなプログラムを作ったのですが、実行してもsportsのままで何も変わりません・・・。 #include<stdio.h> void mojihenkan(char *); main(void) { char moji[8]={"sports"}; char *p; int i; mojihenkan(moji); p=moji; for(i=0;i<8;i++){ printf("%c",*(p+i)); } return 0; } void mojihenkan(char *a) { int i; for(i=0;i<8;i++){ if(*(a+i)=='s'){ a-32; } } }

  • 文字列の文字一文字ずつを解析して結果を表示したいのですが・・・

    たとえば $data="あ5Aいう7えお" という文字列があったとして 一文字ずつの決まった長さの合計を表示しようとおもっています。 $KAZU=mb_strlen($data,"SJIS"); for($i=0;$i!=$KAZU;$i++){      $moji=mb_substr($data,$i,$i,"SJIS");      $moji_size=mb_strwidth($moji,"SJIS");      if($moji_size==2){           $px+=12;      }else{           if(mbereg("/[A-Z]./",$moji)){                $px+=10;           }elseif(mbereg("/[0-9]./",$moji)){                $px+=9;           }elseif(mbereg("/[a-z]./",$moji)){                $px+=8;           }else{                $px+=6;           }      }      if($px>370){           $px=0;           break;      } } print "$px"; $data="あ5Aいう7えお"の場合結果は(12+9+8+12+12+9+12+12=)86になってほしい この方法でやってもうまくいきませんでした。なんだか面倒なことしているような気もしますが、もっと簡単な方法など知っている方などいらっしゃいましたら、どなたか教えていただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字列の検索&排除をするプログラム

    「a=i;」とするとご存知の通り、aにiという変数を代入します。 しかし、変数としてではなく「文字(char型)」として処理したいと考えております。 例えば、「1,2,3,a,4,5,6」という文字列を1文字ずつ読み込み、 「a」という文字であれば表示しない、 という感じのプログラムを作成したいと思います。 つまり、「1,2,3,a,4,5,6」が「1,2,3,4,5,6」となります。 moji[]に「1,2,3,a,4,5,6」をchar型で代入したときの プログラムの例を書きます。 for (i = 0; i <= 6; i++){ if(moji[i]==a){//何もしない、ちなみに間違えています。 } else{//a以外が表示される printf("%c", moji[i]); } } 質問は「moji[i]==a」この部分を文字(char型)の「a」とし、 「1,2,3,a,4,5,6」を「1,2,3,4,5,6」の様に処理したいのですが、 どうしたらよろしいでしょうか?

  • 文字列の検索

    プログラミングの勉強の際に下のプログラムを作りました。 最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 コンパイルは通るのですが、文字列を2つ入力すると 「セグメンテーション違反です」と表記されます… どこが悪いのでしょうか? どなたか解説・指摘・模範解答などおねがいします。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(*c!='\0'){ c=a; d=b; while(*c!='\0' && *d!='\0') if(*c!=*d) printf("0"); break; c++; d++; } if(*d='\0') printf("1"); a++; return a; return NULL; }

  • 文字を置き換える関数で分からないことがあります。

    文字列strの中にある、文字列bagと共通の文字を空白に置き換える関数とその動作を確認するための、空白に置き換えた文字列strを表示するプログラムですが、戻り値が正しくないそうです。 ヒントでもいいのでどう直せばいいのかどなたかお教え下さい。 #include <stdio.h> char str_space(char str[], char bag[]){ int a, b, c, d; for(a = 0; a <= 99; a++){ if(str[a] == '\0'){ c = a; break; } } for(a = 0; a <= 99; b++){ if(bag[a] == '\0'){ d = a; break; } } for(a = 0; a <= c; a++){ for(b = 0; b <= d; b++){ if(str[a] == bag[b]){ str[a] = ' '; } } } return str[]; } int main(void){ char str[100], bag[100]; scanf("%s", str); scanf("%s", bag); printf("%s", str_space(str, bag)); return 0; }

  • 単語数、文字数のカウントプログラム

    以下のような単語数、文字数のカウントプログラムを作ったのですが、10行目に「フォーマットは char ですが、引数は different type です」というエラーが出てしまいます。どのように修正したらよいでしょうか?教えてください。 #include <stdio.h> int main(void){ int wordcnt = 0; int charactercnt = 0; int i; char line[100]; printf("String: "); fgets(line, sizeof(line), stdin); sscanf(line, "%s", &line); if(line[0] != ' '){ wordcnt++; } for(i = 0; line[i] != '\0'; i++){ if(line[i - 1] == ' '){ wordcnt++; } if(line[i] != '\n'){ charactercnt++; } } if(wordcnt == 1){ printf("%d word,", wordcnt); }else{ printf("%d words,", wordcnt); } if(charactercnt == 1){ printf(" %d character", charactercnt); }else{ printf(" %d characters", charactercnt); } return 0; }

  • 文字列操作(終端と抽出)について

    こんばんは お時間等ございましたら、ご指摘よろしくお願いします。 <背景>メインプログラムからサブプログラムに複数の数値を渡して、     文字列として編集します。     そして、その文字列から特定の文字のみを抽出し、     ファイルに出力したいと考えています。     ※下記にソースイメージを記しました。      ただ、While文の指定がうまくなく、      想定どおり処理を抜けれません。 <質問>サブプログラムでファイルに出力する文字のうち、     抽出する文字と抽出しない文字はランダムで、     メインプログラムから、渡されてきます。     ※文字列の文字数は、     メインから渡され編集した文字数>=ファイルに出力する文字数。     サブプログラムの先頭で出力する文字列の大きさを     指定しているのですが、抽出しない文字があった場合、     抽出しない文字数分ゴミが出力されてしまうのを     防ぎたいと考えています。 <イメージ> #include <stdio.h> void sub( int a, int b, int c, FILE *fp ); int main(){ FILE *fp; fp = fopen("c:\\0511.txt","w"); int a;int b;int c; a = 1; b = 0; c = 1; sub( a, b, c, fp ); fclose(fp); } void sub( int a, int b, int c, FILE *fp ){ int j = 0; char moji[4];char moji2[4]; sprintf(moji,"%d%d%d%s",a,b,c,"\0" ); while( moji[moji[*moji]] != '\0' ){ switch( moji[moji[*moji]] ){ case '1' : moji2[j] = moji[moji[*moji]]; break; case '0' : j -= 1; break; default :;break; } moji[*moji] += 1;j += 1; } fprintf(fp,"%s\n",moji2 ); }// Run-Time Check Failure #2 - Stack around the variable 'moji' was corrupted. もし宜しければ、ご指摘の程よろしくお願いします。