• 締切済み

計算機言語(C言語)の課題です。

ポインタstrが文字列の先頭文字を指しているとき、その文字列に含まれる数字、符号’+’及び’-’以外の文字を削除する関数 void del_char(char *str) を作成しなさい。例えば、A-+1BC2+3D\0であれば-123\0とする。なお、符号についても、数字より前にある最初のもの以外は、削除するものとする。

みんなの回答

回答No.2

この質問は、2ページめにまわされたので、もう回答しても良いでしょう。 回答プラグラムを↓に示します。 プログラムはマイナス符号はともかく、プラス符号もそのまま出力します。不要ならば自分で修正を加えてください。 プログラムの要点は以下のとおりです。 文字配列 buf[] は、サーチ用のポインター char *p と buff[] 内容置き換え用のポインター char *str の2つを用意し、符号フラッグ int hugo=1 として立てて(ゼロでない)おくことと、isdigit() 関数を使うことにあります。 http://www9.plala.or.jp/sgwr-t/c/sec07.html プログラムは while() を使いますが、判定は c=*p の1バイト代入結果からステータスレジスターの zero フラッグが反応するのを利用しています。 http://en.wikipedia.org/wiki/Status_register それが c=*p を使う理由です。慣れないと「???」となりますが、慣れないうちは while((c=*p)!='\0') としても構いません。 #include <stdio.h> #include <ctype.h> //isdigit() void del_char(char *); //プロトタイプ宣言 int main(void) { char buff[]="A-+1BC2+3D"; printf("buff[]= %s\n",buff); del_char(buff); printf("result= %s\n", buff); return 0; } void del_char(char *str) { char *p; int c,hugo=1; p=str; while(c=*p){ if(hugo && (c=='+' || c=='-') || isdigit(c)) { hugo=0; *str++=c; } p++; } *str='\0'; } ----- 実行結果 ----- buff[]= A-+1BC2+3D result= -123

全文を見る
すると、全ての回答が全文表示されます。
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.1

疑問点を明確にしてください。 問題を見せられただけでは残念ながら質問の内容がわかりません。 普通に1文字ずつ判定していけばいいと思いますけど。 不要な文字を消すときはmemmoveとか使うかな。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 計算機言語(C言語)の課題です。

    ポインタstrが文字列の先頭文字を指している時、その文字列に含まれる英小文字を英大文字に変換する関数 void str_toupper(char *str) を作成しなさい。ただし、英小文字a~zおよび英大文字A~Zには、それぞれ昇順に、連続した1バイトの整数が割り当てられているものとする。例えば、aには10進数の97、zには10進数の122が割り当てられ、Aには10進数の65、Zには10進数の90が割り当てられるといった具合である。

  • C言語の問題があと少しでわからないのですが

    学校の課題に取り組んで分からないことろが出てきました。問題は以下のものです。 問題13 任意の文字列を(str)を入力して、削除文字を入力させ、strから削除文字を削除して表示しなさい。 出力例:str = abcd 削除文字:c →結果:abd というものです。 途中まで自分で考え ------------------------------------------------------------------------------------------------------------------- #include <stdio.h> void rmv(char *str, char c); int main(void) { char str[80]; int c; printf("文字列入力 : "); fgets(str, 80, stdin); printf("削除文字入力 : "); c = getchar(); void rmv(str, (char)c); printf("削除後文字列 : %s", str); return 0; } void rmv(char *str, char c) { while(*str) { if(*str == c) { while(*str) { *str = *(str + 1); ++str; } } ++str; } *str = '\0'; } --------------------------------------------------------------------------------------------------------- としましたが削除文字判定と文字つめのループ用に同じポインタを使っているので文字が一文字しか消えないと言われました。 解決方法にrmv関数内で別のポインタを用意し、if文内でコピー(例 p =str;)し次のwhile文内でこのポインタを用いて判定するというヒントを貰いましたが。自分で組んでいて上手く動きません。 どのように処理をしていけばいいでしょうか。 超初心者なので説明も付けていただくと有難いです。

  • 文字列内の数字削除

    C言語の質問です。文字列str中の数字文字を削除する関数をポインタを使って作りたいのですが、どう作ったらいいかわかりません。方向性だけでも教えてくれませんか。 ちなみにヒントとして以下の部分は与えられてました。よろしくお願いします。 void del_digit(char *str) { char *ptr = str; while(*str){

  • 文字列str内の全ての数字を削除する関数

    文字列str内の全ての数字を削除する関数 void del_digit(char str[]) を作成。 (例えば、"ab1C9"を受け取ったら、"ABC"にする) という関数を作りたいのですが、うまくいきません。 過去に似たような『文字列内の数字削除』の質問をされた方が いましたが、ポインタを使っていました。 http://okwave.jp/qa1775576.html ポインタを使わずにするには、どうしたらよいのでしょうか? 途中まで作ってみたのですが、うまく動きません。 #include <stdio.h> #include <ctype.h> void del_digit(char str[]) {     unsigned i = 0, j = 0;     char ctr[] = {'0'};     while (str[i] != '\0') {           ctr[i] = str[i];           i++;     }     i = 0;     while (ctr[i] != '\0') {           if (ctr[i] < '0' || ctr[i] > '9') {              str[j] = toupper(ctr[i]);              j++;           }           i++;     }     str[j] = '\0'; } int main(void) {     char str[100];     printf("文字列を入力してください:");     scanf("%s", str);     del_digit(str);     printf("%s\n", str);     return (0); }

  • C言語について教えてください。

    #include <string.h> #include <stdio.h> void print_all_char(char *str) { while(*str! = '\0') { printf("%c\n", *str); str++; } } int main(void) { char astr[5]; char *pstr; strcpy(astr, "ABCD"); pstr = "EFGHI"; puts("「配列で実現する文字列」を表示する"); puts(astr); puts("「配列で実現する文字列」のすべての文字を表示する"); print_all_char(astr); puts("「ポインタで実現する文字列」を表示する"); puts(pstr); puts("「ポインタで実現する文字列」のすべての文字を表示する"); print_all_char(pstr); return 0; } 自分でつくった上のプログラムではエラーが発生します。 なぜだか分かりません。教えてください。 ちなみに、実行結果は 「配列で実現する文字列」を表示する ABCD 「配列で実現する文字列」のすべての文字を表示する A B C D 「ポインタで実現する文字列」を表示する EFGHI 「ポインタで実現する文字列」のすべての文字を表示する E F G H I のようにしたいです。 よろしくお願いします。

  • C言語について

    2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか? /*文字列連結*/ void *my_stract(char*, char*, char*); void main(void) { char bun1[100],bun2[100],bun3[200]; printf("文字列1を入力してください\n"); gets(bun1); printf("文字列2を入力してください\n"); gets(bun2); my_stract(bun1,bun2,bun3); puts(bun3); } char *my_stract(char *str3, char *str2, char *str1) { char *p1, *p2, *p3; p1=str1; p2=str2; p3=str3; while(*p1) { *p3=*p1; p1++; p3++; } while(*p2) { *p3=*p2; p2++; p3++; } *p3='\0'; return str3; }

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • C言語、スキャン集合について

    下記のプログラムはスキャン集合を使って入力された文字列の先頭に 並んでいる数字を読み込んで捨て、その後に続く文字列を読み込んで 表示するものです。 #include <stdio.h> int main(void) { char str[80]; printf("数字に続けて文字列を入力してください\n"); scanf("%*[0-9]%s", str); printf("%s", str); return 0; } 【質問】%*[0-9] を %[^0-9] に置き換えてコンパイルして実行すると、 意味不明の文字列が出力されるのはなぜでしょうか? 置き換えても同じ結果になる気がするのですが…

  • C言語のポインタにの動作について

       以下のコードで、DelHalfSpc() において引数 str は str++ でカウントされ、ループを抜けた時点では文字列の末尾を指しているはずですが、なぜ呼び出し側の main()の char str[] には正しい値が入るのでしょうか? char *DelHalfSpc(char *str) {   //char *dmy = str; → char * という型の変数 dmy の宣言   char *dmy, *Res;   Res = dmy = str; // Res は常に先頭アドレスを指す   while (*str != '\0') {     if ( *str != ' ' ) {       *dmy = *str;       dmy++;     }     str++;   }   //ループを抜けたこの時点で str は文字列の末尾を指しているはず   *dmy = '\0';   return Res;   //ここを return str とするとヌル文字列を返す } int main(void) {   char str[] = " 1 23 4 5";   printf("空白削除前:\"%s\"\n", str);   printf("空白削除後:\"%s\"\n", DelHalfSpc(str));   printf("str も変化:\"%s\"\n", str); //なぜ正しい結果が表示されるのか?   return 0; } 【結果】 ----------------------- 空白削除前:" 1 23 4 5" 空白削除後:"12345" str も変化:"12345"

  • C言語のポインタと配列について

    下のコードについて2つ質問があります。 (1) char *p; p = str; ならわかるのですが、なぜ型が違う char *p = str; のような代入がOKなのでしょうか。文字列をコピーするときの   *p = *str; と比較して、とても違和感があります。  str は引数で受けた文字列の先頭アドレス。 (2)   char *str;   str = " 1 23 4 5"; と   char str[] = " 1 23 4 5"; との違いがよくわかりません。 #include <stdio.h> #include <ctype.h> void TrimSpace(char *str) {   char *p = str;        // (1)型が違うのになぜこんな代入をするのか?      while (*str != '\0') {     if ( !isspace(*str) ) {       *p = *str;      // この代入は自然       p++;     }     str++;   }   *p = '\0'; } int main(void) {      //char *str;   //str = " 1 23 4 5";     (2)これでは空白を詰めた後の文字列が表示されないのはなぜか?      char str[] = " 1 23 4 5"; //これで OK   printf("空白を詰める前:\"%s\"\n", str);   TrimSpace(str);   printf("空白を詰めた後:\"%s\"\n", str);   return 0; }