プログラムのコンパイルエラー対処方法

このQ&Aのポイント
  • プログラムのコンパイルエラーが発生しました。エラーメッセージは「expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘main’」です。
  • エラーメッセージの原因は、関数の宣言が正しく行われていないことです。
  • 関数の宣言を修正することでコンパイルエラーを解消できます。
回答を見る
  • ベストアンサー

下記のプログラムがコンパイラでエラーになります。

その後のプログラムです。 /************************************************************ 文字列を比較する関数 戻り値 : ps1 > ps2 1 ps1 = ps2 0 ps1 < ps2 -1 *************************************************************/ int str_cmp(char *ps1,char *ps2) /*ps1,ps2 : 比較する文字列が入った配列を指すポインタ*/ { int kekka; /*比較結果*/ for(;*ps1 != '¥0' && *ps2 != '¥0' && *ps1 == *ps2 ;ps1++,ps2++); if (*ps1 > *ps2) { kekka = 1; } else if(*ps1 == *ps2) { kekka = 0; } else { kekka = -1; } return kekka; } /************************************************************* 文字列と文字列とを交換する関数 *************************************************************/ void str_change(char *ps1,char *ps2) /* ps1,ps2 : 交換する文字列が入った配列へのポインタ*/ { char temp[DATA_LEN] /*交換用一時保管*/ str_cpy(temp,ps1); /*複写 ps1->temp */ str_cpy(ps1,ps2); /*複写 ps2->ps1 */ str_cpy(ps2,temp); /*複写 temp->ps2 */ } /************************************************************* 文字列を複写する関数 *************************************************************/ void str_cpy(char *pd,char *ps) /* char *pd :複写される配列へのポインタ*/ /* char *ps :複写する配列へのポインタ*/ { for(;*ps != '¥0';ps++,pd++) { *pd = *ps; /*1文字複写*/ } *pd = '¥0'; /*最後の1文字*/ } これをコンパイルすると kansuu4.c: In function ‘atr_cpy’: kansuu4.c:18: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘main’ kansuu4.c:41: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token kansuu4.c:57: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token kansuu4.c:85: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token kansuu4.c:112: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token kansuu4.c:128: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token kansuu4.c:134: error: expected ‘{’ at end of input と出ました。 本当は自分で努力するべきだと思います。 「自分でよく見てみろ。」 でも結構です。 ご多忙中申し訳ありません。 ご回答の程、宜しくお願い致します。

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

  • ベストアンサー
  • kerneru
  • ベストアンサー率37% (45/120)
回答No.1

「自分でよく見てみろ。」 ちなみに私の環境でコンパイルしたら、エラーが量産されました。 エラー E2451 test.cpp 19: 未定義のシンボル intkekka(関数 intstr_cmp(char *,char *) ) エラー E2451 test.cpp 29: 未定義のシンボル kekka(関数 intstr_cmp(char *,char *) ) エラー E2451 test.cpp 73: 未定義のシンボル chartemp(関数 voidstr_change(char *,char *) ) エラー E2451 test.cpp 73: 未定義のシンボル DATA_LEN(関数 voidstr_change(char *,char *) ) エラー E2379 test.cpp 77: ステートメントにセミコロン(;)がない(関数 voidstr_change(char *,char *) ) エラー E2268 test.cpp 79: 未定義の関数 'str_cpy' を呼び出した(関数 voidstr_change(char *,char *) ) エラー E2451 test.cpp 81: 未定義のシンボル temp(関数 voidstr_change(char *,char *) ) 警告 W8070 test.cpp 85: 関数は値を返すべき(関数 voidstr_change(char *,char *) ) 警告 W8070 test.cpp 115: 関数は値を返すべき(関数 voidstr_cpy(char *,char *) )

offikou
質問者

お礼

そうですね。 かと言って他の言語も知りませんが、C言語は難しい、と感じます。 仕事として今は必要がないからかも知れませんが達成感などないです。 極めるとOSだって作れちゃう・・・と言う言葉を鵜呑みにしてしまったのかも知れません。 それは私にはハードルが高過ぎでしょう。 でもありがとうございました。

その他の回答 (4)

回答No.5

おや、頻繁に出て来る質問の「for(;*ps != '\0';ps++,pd++)」の書き方が上級者風(ps++,pd++)っていうのもアンバランスで面白いですね。 また、for() の初期値を「 ; 」だけでクリアする使い方も気に入りました。 ただ、それは while() に変更するとプログラムの見通しが良くなるように思います。 /* int, void, スペースをきちんと書くと こんな感じになりました。 */ #include <stdio.h> #define N 7 #define ON 1 #define OFF 0 #define DATA_LEN 20 /* プロトタイプ宣言 */ void printData(char p[][DATA_LEN], int n); void sort(char p[][DATA_LEN], int n); void str_change(char *ps1, char *ps2); void str_cpy(char *pd, char *ps); int str_cmp(char *ps1, char *ps2); int main(void) { char p_data[N][DATA_LEN] ={"ふじさわ","えのしま","しちりがはま","ごくらくじ","はせ","ゆいがはま","かまくら"}; printData(p_data,N); sort(p_data,N); printf("\nソートしました\n\n"); printData(p_data,N); return 0; } void printData(char p[][DATA_LEN], int n) { int i; for(i=0;i<n;i++) printf("%s\n",p[i]); } void sort(char p[][DATA_LEN], int n) { int sw; int i,j; sw = ON; for(i = n-1; i>=1 && sw == ON; i--){ sw = OFF; for(j = 0; j< i; j++){ if(str_cmp(p[j],p[j+1]) > 0){ str_change(p[j],p[j+1]); sw = ON; } } } } int str_cmp(char *ps1, char *ps2) { int kekka; while(*ps1 && *ps2 && *ps1==*ps2) ps1++,ps2++; //for(; *ps1 != '\0' && *ps2 != '\0' && *ps1 == *ps2; ps1++,ps2++); if(*ps1 > *ps2) kekka = 1; else if(*ps1 == *ps2) kekka = 0; else kekka = -1; return kekka; } void str_change(char *ps1, char *ps2) { char temp[DATA_LEN]; str_cpy(temp,ps1); str_cpy(ps1,ps2); str_cpy(ps2,temp); } void str_cpy(char *pd, char *ps) { while(*pd++=*ps++); //for(;*ps != '\0';ps++,pd++) // *pd = *ps; //*pd = '\0'; }

offikou
質問者

お礼

そうですね。 かと言って他の言語も知りませんが、C言語は難しい、と感じます。 仕事として今は必要がないからかも知れませんが達成感などないです。 極めるとOSだって作れちゃう・・・と言う言葉を鵜呑みにしてしまったのかも知れません。 それは私にはハードルが高過ぎでしょう。 まだC言語って何者かがつかめません。 でもありがとうございました。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.4

実際のソースをちゃんと貼り付けないとどうにもなりませんよ。 >kansuu4.c: In function ‘atr_cpy’: このエラーに該当するところはないし。

offikou
質問者

お礼

まだC言語って何者かがつかめません。 Windowsでやる場合とEmacsでやる場合でコンパイルが違う結果になるような気がします。 とにかく解っていませんが、ありがとうございます。

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

タイプミスを直せば動きます。 あとは、無駄な改行とコメントを省くこと。そうすれば、一回で投稿できます。 #include <stdio.h> #define N 7 #define ON 1 #define OFF 0 #define DATA_LEN 20 void printData(char p[][DATA_LEN], int n); void sort(char p[][DATA_LEN], int n); void str_change(char *ps1,char *ps2); void str_cpy(char *pd,char *ps); int str_cmp(char *ps1,char *ps2); void main(){ char p_data[N][DATA_LEN] = {"ふじさわ","えのしま","しちりがはま","ごくらくじ","はせ","ゆいがはま","かまくら"}; printData(p_data,N); sort(p_data,N); printf("\nソ\ートしました\n\n"); printData(p_data,N); } void printData(char p[][DATA_LEN], int n){ int i; for(i=0;i<n;i++){ printf("%s\n",p[i]); } } void sort(char p[][DATA_LEN],int n){ int sw; int i,j; sw = ON; for(i = n-1 ; i>=1 && sw == ON ; i--){ sw = OFF; for(j = 0; j< i ;j++){ if(str_cmp(p[j],p[j+1]) > 0){ str_change(p[j],p[j+1]); sw = ON; } } } } int str_cmp(char *ps1,char *ps2){ int kekka; for(;*ps1 != '\0' && *ps2 != '\0' && *ps1 == *ps2 ;ps1++,ps2++); if(*ps1 > *ps2){ kekka = 1; }else if(*ps1 == *ps2){ kekka = 0; }else{ kekka = -1; } return kekka; } void str_change(char *ps1,char *ps2){ char temp[DATA_LEN]; str_cpy(temp,ps1); str_cpy(ps1,ps2); str_cpy(ps2,temp); } void str_cpy(char *pd,char *ps){ for(;*ps != '\0';ps++,pd++){ *pd = *ps; } *pd = '\0'; }

offikou
質問者

お礼

もはや難しすぎるって現状です。 とにかく、ありがとうございました。

noname#29459
noname#29459
回答No.2

そもそも、ちゃんと cut&paste してないので、オリジナルソースがみえてませんが。 instr_comp て関数宣言からして変ですが。 さらに、ソースがまともに表示できてないので行番との対応付けは、回答者がするの? 結論としては、質問のしかたが、なっちゃいないと思う。

offikou
質問者

お礼

もう色んな方に質問を丸投げしてしまって こんな結果になりました。 本当に申し訳ございません。 今後は一つ一つやって行きます。

関連するQ&A

  • 下記のプログラムがコンパイラでエラーになります。

    いつも教えて頂きありがとうございます。 実は基本を理解しておらず、キーパンチの練習になっています。 もう1冊自分にも解る書籍を購入しようと思います。 このプログラムの誤りだけでも教えて頂きたいのです。 2000文字では足りないので、2回に分けて投稿させて頂きます。 下記のプログラムです。 /***************************************************** 基本交換法による並べ替えを行うプログラム ******************************************************/ #include <stdio.h> #define N 7 /*データ個数*/ #define ON 1 /*sw : 交換しました*/ #define OFF 0 /*sw : 交換していません*/ #define DATA_LEN 20 /*データ配列の1列の要素数*/ /*関数のプロトタイプ宣言*/ void printData(char p[][DATA_LEN], int n); /*文字列を表示する関数*/ void sort(char p[][DATA_LEN], int n); /*文字列を並び替える関数*/ void str_change(char *ps1,char *ps2); /*文字列と文字列とを交換する関数*/ void atr_cpy(char *pd,char *ps) /*文字列を複写する関数*/ int str_cmp(char *ps1,char *ps2) /*文字列と文字列とを比較する関数*/ main() { /*データの宣言*/ char p_data[N][DATA_LEN] = {"ふじさわ","えのしま","しちりがはま", "ごくらくじ","はせ","ゆいがはま","かまくら"}; /*最初の状態を表示*/ printData(p_data,N); /*並べ替え*/ sort(p_data,N); /*結果を表示*/ printf("¥nソ¥ートしました¥n¥n"); printData(p_data,N); } /**************************************************** ポインタ型から文字列を表示 ****************************************************/ void printData(char p[][DATA_LEN], int n) /* p : 二次元配列*/ /* n : 文字列の要素数*/ { int i; /*添え字*/ for(i=0;i<n;i++) { printf("%s¥n",p[i]); } } /***************************************************** 基本交換法 *****************************************************/ void sort(char p[][DATA_LEN],int n) /* p : 二次元配列*/ /* n : 文字列の要素数*/ { int sw; /*交換したか*/ int i,j; /*添え字*/ sw = ON; for(i = n-1 ; i>=1 && sw == ON ; i--) { sw = OFF; for(j = 0; j< i ;j++) { /* p[j] <= p[j+1]となるようにする*/ if(str_cmp(p[j],p[j+1]) > 0) { str_change(p[j],p[j+1]; /*交換*/ sw = ON; } } } } もう1回投稿致します。

  • CGIへのコンパイルエラー

    初めまして。プログラミング暦はほとんどありません。javaを少しかじった程度です。今回Ajaxへ挑戦しようと思い、 http://itpro.nikkeibp.co.jp/article/COLUMN/20060115/227278/?ST=nettech の予測補完インタフェースを作成しよとしています。 環境はfedoracore5でXPからのputyからの遠隔です。 complete.cをcomplete.cgiへコンパイルするときに、 [root@localhost html]# gcc -Wall -O2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include complete.c -o complete.cgi -lglib-2.0 -lsary -lpthread complete.c:1: error: stray ‘\357’ in program complete.c:1: error: stray ‘\273’ in program complete.c:1: error: stray ‘\277’ in program complete.c:1: error: stray ‘#’ in program complete.c:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token In file included from complete.c:2: /usr/include/string.h:39: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:43: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:52: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:59: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:62: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:66: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:88: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:96: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:102: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:109: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘strxfrm’ /usr/include/string.h:184: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘strcspn’ /usr/include/string.h:188: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘strspn’ /usr/include/string.h:242: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘strlen’ /usr/include/string.h:270: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:288: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:292: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:296: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:299: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/string.h:329: error: expected declaration specifiers or ‘...’ before ‘size_t’ In file included from /usr/include/string.h:417, from complete.c:2: /usr/include/bits/string2.h:969: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__strcspn_c1’ /usr/include/bits/string2.h:971: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__strcspn_c1’ /usr/include/bits/string2.h:979: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__strcspn_c2’ /usr/include/bits/string2.h:982: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__strcspn_c2’ /usr/include/bits/string2.h:991: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__strcspn_c3’ /usr/include/bits/string2.h:994: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__strcspn_c3’ とエラーがでます。どうしたらいいでしょうか?(文字数の関係で半分しか掲載できませんでした。)よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • ANSI C コンパイルエラー

    下記のファイルをコンパイルする際にCent OS & Windows7 ではReadme 通りにコンパイルできたんですがMac OSX Lion では以下のエラーが出てしまいます。 http://www.itu.int/rec/T-REC-G.711-200911-I!Amd2/en どのようにしたらよいのでしょうかご教示お願いいたします。 コンパイルエラー ーーーーーーーーーーーーーーーーーーーーーーーー make -C src/mainlib "CC=gcc" "CXX=g++" gcc -O2 -Wall -fno-builtin -DWMOPS=1 -DAPPENDIX_I_POSTFILTER -I../basicOp_stl2005_v2.2 -Iutil -Ig711wbe -Ilower_band -Ihigher_band -Iapp1_postfilter -c util/dsputil.c -o util/dsputil.o In file included from ../basicOp_stl2005_v2.2/stl.h:27, from util/dsputil.h:18, from util/dsputil.c:11: ../basicOp_stl2005_v2.2/basop32.h:52: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘Overflow’ ../basicOp_stl2005_v2.2/basop32.h:53: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘Carry’ ../basicOp_stl2005_v2.2/basop32.h:67: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘add’ ../basicOp_stl2005_v2.2/basop32.h:68: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘sub’ ../basicOp_stl2005_v2.2/basop32.h:69: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘abs_s’ ../basicOp_stl2005_v2.2/basop32.h:70: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘shl’ ../basicOp_stl2005_v2.2/basop32.h:71: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘shr’ . . . . . .

  • VC++2008のエラー

    //load.c GROBAL void loadmain(); //fps.cpp GLOBAL void wait_fps(); GLOBAL void fps(); 上記のソースをコンパイルしようとしたら function.h:2: error: expected '=', ',', ';', 'asm' or'__attribute__' before 'void' というエラーがでました 対策法を教えてください ちなみにGROBALはhttp://dixq.net/rp/5.htmlを参考にしてつけました

  • トークンで分けた文字列をさらにトークンで分ける

    初心者です。よろしければご教授下さい。 temp.c:12: warning: useless keyword or type name in empty declaration というような文字列がg_str02[0]に格納されている時に、まずは「 」(半角スペース)を区切り文字としてトークンごとに分け最初の2つのトークンをmretsu1[0]とmretsu1[1]の中に格納し、さらにmretsu1[0](上記で言う「temp.c:12:」)を「:」を区切り文字としてトークンごとに分けmretsu2[0]とmretsu2[1]に格納するような関数を作りたいのですが、コンパイルは成功するのですが、できた実行ファイルを実行するとエラーが起きて強制終了されてしまいます。 現在ソースは以下のようになっています。 ////////// char mretsu1[255][255]; char mretsu2[2][255]; char *token1 = " "; char *token2 = ":"; strcpy(mretsu1[0], strtok(g_str02[0], token1)); strcpy(mretsu1[1], strtok(NULL, token1)); strcpy(mretsu2[0], strtok(mretsu1[0], token2)); strcpy(mretsu2[1], strtok(NULL, token2)); ////////// デバッグをしてみた所、どうもmretsu1[0]をさらに分解しているところにエラーがあるようです。 よろしくお願いします。

  • C言語 2次方程式の解を求めるプログラム

    ポインタを使った2次方程式の解を求めるプログラムを作りたいのですが、どこが間違っているのか分かりません。 #include<stdio.h> #include<math.h> int quadEq(int a, int b, int c, double *px1, double *px2) int main() { int a,b,c,s; double x1,x2; printf("?"); scanf("%lf",&a); printf("?"); scanf("%lf",&b); printf("?"); scanf("%lf",&c); if((s=quedEq(a,b,c, &x1, &x2))==2){ printf("%f %f", x1,x2); // 解が二つ } else if(s==1){ printf("%f", x1);// 重解 } else { printf("No real solution");// 虚数解 } } int quadEq(int a, int b, int c, double *px1, double *px2) { int d = b*b-4*a*c; if(d>0){ *px1 = (-b+sqrt(d))/(2*a); *px2 = (-b-sqrt(d))/(2*a); return 2; } else if(d==0) { *px1=-b/2*a; *px2=-b/2*a; return 1; } else { return 0; } } エラーは mondai.c: 関数 ‘quadEq’ 内: mondai.c:5:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before {’ token { ^ mondai.c:26:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token { ^ mondai.c:39:1: エラー: expected ‘{’ at end of input } ^ となりました。括弧の位置の間違いや入れ忘れはないと思うのですが、何か根本的なミスがあるのでしょうか。添削お願いします。

  • c#でC言語のstrtokに相当する関数は何か

    文字列から指定した文字でデータを区切る関数strtokがC言語にはある これに相当するC#の関数は何か 例えばCでは以下のように書く。 char data1[]= " 123 , 456 Yamada " ; char *token ; strtok( data, " ," ) ; /* スペースとカンマを区切りに文字列を抽出 */ token = strtok( str, " ." ); printf(" token chat = %s\n", token ) ; while ( token != NULL ) { token = strtok( NULL," ." ); if ( token != NULL ) printf(" token chat = %s\n", token ) ; } これに相当するc#のSplit関数を使用すると 不要な空白を取り出しているようである 知っている方がおりましたら、教えて下さい。

  • C++ : cout << (数字) で実行時エラーが発生する理由

    ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。 具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。 受け取った文字列を逆順にする関数です。 ---------------------------------------------------------- void rev_str(char *a) { int length = 0; cout << length; // ここでエラーが発生 while(true) { if(*(a + length) == '\0') break; length++; } for(int i = 0; i < length / 2; i++) { char temp = a[i]; a[i] = a[length - i - 1]; a[length - i - 1] = temp; } } --------------------------------------------------------- エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。 このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。 この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。 コード全体はこの下に掲載します。 cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。 全コード ------------------------------------------------------ #include <iostream> #include <cstring> using namespace std; void rev_str(char *a); void rev_str(const char *source, char *des); int main() { char a[80], b[80]; strcpy(a, "hello, world!"); rev_str(a, b); rev_str(a); cout << a << "\n"; cout << b << "\n"; return 0; } void rev_str(char *a) { int length = 0; cout << length; while(true) { if(*(a + length) == '\0') break; length++; } for(int i = 0; i < length / 2; i++) { char temp = a[i]; a[i] = a[length - i - 1]; a[length - i - 1] = temp; } } void rev_str(const char *source, char *des) { char *a = (char*)malloc(sizeof(source)); strcpy(a, source); rev_str(a); strcpy(des, a); free(a); }

  • 全角文字を含んだ文字の並びを逆順にするには?

    こんにちは。 C言語において、以下のような2つの関数を利用して、全角文字を含んだ文字列の並びを逆順にする事を考えました。 ちなみにコンパイラは、borlandのC++コンパイラを使っています。 文字コードがShift_JISの場合、全角文字の上位バイトが0x81~0x9F、0xE0~0xFCの範囲に収まるという事を聞いたので、まず、以下のように、渡された文字が、全角文字の上位バイトかどうかを判定する関数を作りました。 ____________________________________________________________ int is_2byte(unsigned char c){ return ( ( (c >= 0x81) && (c <= 0x9f) ) || ( (c >= 0xe0) && (c <= 0xfc) ) ); } ____________________________________________________________ 次に、上の関数を利用し、以下のように、渡された文字列の、文字の並びを逆順にする関数を作りました。 ____________________________________________________________ void rev_str(char *str) { char temp[1000]; char tmp; int i, j; for(i=strlen(str)-1, j=0; i>=0; i--, j++){ temp[j]=str[i]; if(is_2byte(temp[j])){ tmp=temp[j-1]; temp[j-1]=temp[j]; temp[j]=tmp; } } temp[j]='\0'; strcpy(str, temp); } __________________________________________________ この関数を、あいうえお順に試して行った所、ひらがなの 「あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめ」 という文字列は、逆順にする事ができたのできました。 しかし、「も」以降の文字を含ませた途端、実行時エラーが発生し、プログラムがストップしてしまいます。 また、カタカナの場合は、「メ」以降の文字を含ませた場合に、実行時エラーとなります。 何が問題なのかが全然分からないので、困っています。 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • secが・・確認お願いできませんか?

    秒数が出ないのですがどこが違うのでしょうか? #define TCNT0 (*(volatile unsigned int *)0xffff68) #define GRA0 (*(volatile unsigned int *)0xffff6a) #define GRB0 (*(volatile unsigned int *)0xffff6c) #define TCR0 (*(volatile unsigned char *)0xffff64) #define TIOR0 (*(volatile unsigned char *)0xffff65) #define TIER0 (*(volatile unsigned char *)0xffff66) #define TSR0 (*(volatile unsigned char *)0xffff67) #define TSTR (*(volatile unsigned char *)0xffff60) #define ITU_CLOCK8 3 #define ITU_CLEAR_GRA 32 #define ITU_IE_IMFA 1 #define DI asm( "orc.b #0xc0,ccr" ) #define EI asm( "andc.b #0x3f,ccr" ) void start_itu0(); void int_imia0(void) __attribute__ ((interrupt_handler)); int cnt = 0, sec = 0, min = 0, hour = 0; char str[] = "timer 00:00:00"; int main(void) { lcd_init(); lcd_puts(str); start_itu0(); EI; for(;;) { if (cnt >=100) { cnt = 0; sec++; if (sec >=60) { sec = 0; min++; if (min >= 60) { min = 0; hour++; if (hour >= 24) hour = 0; } str[6] = '0' + hour /10; str[7] = '0' + hour %10; str[9] = '0' + min /10; str[10] = '0' + min %10; str[12] = '0' + sec /10; str[13] = '0' + sec %10; lcd_home(); lcd_puts(str); } } } return 0; }