S117 の回答履歴

全72件中1~20件表示
  • なぜ動かないのかわからないです。

    以下のことをしようと思いました。 (1)テキストファイルを読み込む (2)文字列を半角全角を区別しないで済むワイド文字列に変換する (3)デバッグとして、各配列に格納された文字列、文字数、を表示させる この(1)~(3)を行うために以下のようなプログラムを組んでみました。 // ファイルを読み込む #include <stdio.h> #include <string.h> #include <stdlib.h> #include <locale.h> #define LineMax 30000 int main(void){   char FileName[] = "ReadFile.txt";   wchar_t *FileContents[LineMax];  // ワイド文字列格納用配列   char buff[512];  // ファイル読み込み一時領域   int i, buffstrLen;   int FileLineNo = 0;   int FileContentsCharCount[LineMax];   FILE *fp;   // Cロケールカら地域ロケールに変換   setlocale(LC_ALL, "Japanese");   // ファイルを読み込む   fp = fopen(FileName, "r");   if(fp == NULL){     printf("\"%s\"ファイルの読み込みに失敗しました。\n", FileName);     exit(1);   }      // 一行ずつファイルを変数に格納していく   // 無限ループ(ファイルの最後まで)   while(1){     // ファイルから一行読み込み     if(fgets(buff, 512, fp) == NULL){       break;     }     // 一行の長さを計算する(バイト数)     buffstrLen = strlen(buff);     // 領域を確保     FileContents[FileLineNo] = (unsigned short *)malloc(buffstrLen);     if(FileContents[FileLineNo] = NULL){       puts("領域の確保に失敗しました。");       exit(1);     }     // ■間違い?■ワイド文字にした上で、FileContentsポインタ配列に格納する     FileContentsCharCount[FileLineNo] = mbstowcs(FileContents[FileLineNo], buff, buffstrLen);     FileLineNo++;   }   fclose(fp);   /***** ファイル読み込み完了 *****/   FileLineNo--;   printf("ファイルには%d行ありました\n", FileLineNo);   for(i=0; i<FileLineNo; i++){     // i 行目の文字数     printf("DEBUG:FileContents[%03d]の文字数%d文字\n", i, FileContentsCharCount[i]);     // i 行目の文字内容     printf("DEBUG:FileContents[%03d]の内容:%s\n", i, FileContents[i]);   }   return 0; } ■間違い?■で示した部分でFileContents[FileLineNo]の中に、buff配列に一時的に格納した文字列が入っていないように思いました。 文字数は、バイト数ではなく、全角半角区別なく単純な文字数として表示されるのに、読み込み内容が全く表示されないのです(すべて(null)) 無駄な領域をなくすために、毎回バイト数を計算し、その都度mallocで領域を取得して、そこの領域にコピーしているはずなのに… 私の現在の知識量では、解決する策が全く思いつかなかったので、どなたか詳しい方助けてください。 よろしくお願いします。

  • defineで定数が置き換えられない?(C言語)

    #defineについて質問です。 #defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は #include <stdio.h> #define DEF 100 void main(){ printf("#defineで定義された定数はDEFです"); } でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は #defineで定義された定数はDEFです(←置き換えられてない) となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。

    • ベストアンサー
    • noname#113783
    • C・C++・C#
    • 回答数5
  • ポインタの問題です

    学校の課題である文字列をポインタを使って逆順に表示するというプログラムを作ったのですが、「問題で引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い.」ということなんですが、課題が求めている答えと自分が作ったプログラムがあっているか確認お願いします。 #include <stdio.h> void reverseWord(char *str); void main(void) { char *str = "sapporo"; char *p, *q; printf("元: %s\n", str); p = q = str; while (*q != '\0') q++; printf("逆順:"); while (q >= p) putchar(*q--); printf("\n"); } よろしくお願いします。

  • 実行後にコンパイルに失敗しましたってどういうことでしょうか。

    CPad for LSI C-86というC言語のフリーソフトのコンパイラーを使用しています。OSはWindows Vistaです。 #include <stdio.h> int main() { printf("Test Program") } という単純なプログラムを実行すると、「名前を付けて保存」になってしまい、適当にファイル名を付けて保存すると、 「コンパイルに失敗しました。ファイル”適当なファイル名”は存在しません。」 というコメントが表記されてしまって、プログラムの実行ができません。どなたか原因がわかる方、教えてください。よろしくお願いします。

  • 識別子の指定方法?

    C++の勉強を始めたのですが、C++のクラスで、 なかなか分からない無い部分があるので、質問させてください。 表現方法が今一分からないのですが 基本クラスで、派生クラスのインスタンスを格納する領域を作りたいのですが、その方法が分かりません。 例えば class a { b* ob2; public: void b_in(){ ob2 = new b; } void show(){ ob2->show(); } }; class b :public a { public: void show(){cout << "出力する";} }; main() { a ob; ob.b_in(); ob.show(); } (当然上プログラムはバグが出ます) という形で、クラスaで、bのクラスインスタンスを管理したいのです 何か方法は無いものでしょうか… よろしくお願いします

  • long型の定数の末尾にLを付ける意味

    long型の変数に値を代入する時に、値の末尾に"l"または"L"を付けることが推奨されていますが、なぜLを付けるのでしょうか?Lを付けることによって何かが変わるのでしょうか?回答よろしくお願いします。

    • ベストアンサー
    • noname#113783
    • C・C++・C#
    • 回答数3
  • エラー C言語 プログラミングについて

    #include<stdio.h> int leapYear(int); int main(void){ int year,i; for(i=2001;i=2999;i++){ year=i; printf("%d leap = %d \n",i,leapYear(int year)); return 0; } } int leapYear(int year){ if(year%100==0){ return 0; } else if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } } をコンパイルすると11行目に式の構文エラーが出るんですが どうしてでしょうか?? 間違ってない気がするんですけど。。

  • 非常に困ってます

    C言語の問題集の回答がないので困っているので誰か教えてください。 私はまだ始めたばかりなので手におえません。 今私が理解しているif文、switch文、for文、while文、do-while文、配列、を 使用してでお願いします。 以下のプログラムに付け足しをしてバブルソートのプログラムを完成させなさい。 バブルソート前とバブルソート後のそれぞれの並びを表示すること。 #include<stdio.h> #define No 11 main(){ int a[No]={2,7,5,1,7,1,8,3,6,4,9}; int i,j,temp; 実行結果例 before 2 7 5 1 7 1 8 3 6 4 9 after large >>>>>>>>>>> small 9 8 7 7 6 5 4 3 2 1 1

  • qsortの関数ポイントについて

    qsortの関数ポイントについて int int_cmp(const int *a, const int *b) { ------ } main { qsort(x,nx,sizeof(int),(int (*) (const void *, const void * )) int_cmp); 上記の(1)関数のポイント,(int (*) (const void *, const void * )) int_cmpを  普通の(2)関数ポイント(* int_cmp) (const void *, const void * )で呼べない  理由 、また、(1)(2)は、同じ意味でしょうか、教えて頂きたい。

  • バブルソートの実行時間について

    バブルソートで降順、ランダム順に並んでいるデータを読み込ませて昇順に並び替える実行時間について質問です。 バブルソートにおける計算時間は、データ数が多いほど、並び替える回数が多いほど長くなるはずですが、実際に実行したところ、並び替える回数が多いはずの降順のほうがランダム順よりも早くなりました。 なぜこのようになるのですか? よろしくお願いします。

  • このソースの意味を教えてください

    構造体を使ったリストを理解するためのソースで http://www9.plala.or.jp/sgwr-t/c/sec15-5.html のページに以下の関数が書いてありました。 自分はreturn p;とするのが自然であって、head = p;の意味が分かりません。それが不要な処理であるように思えます。 return head;としているのでその前にhead = p;は必要な処理ですが、無駄であって意味が無いように見えましたが、そのように書くのが自然なのでしょうか? head = p;の右に書いてあるコメントもおかしいと思うのですが、皆さんにはそのページのソースのその部分はコメントも含めて不自然さを感じないでしょうか? /*** リストにデータを登録 ***/ struct list *add_list(int key, char *name, struct list *head) {   struct list *p;   /* 記憶領域の確保 */   if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) {     printf("malloc error\n");     exit(EXIT_FAILURE);   }   /* リストにデータを登録 */   p->key = key;   strcpy(p->name, name);   /* ポインタのつなぎ換え */   p->next = head;  /* 今までの先頭ポインタを次ポインタに */   head = p;     /* 新たな領域を先頭ポインタに */   return head; }

  • strcat関数を自作したいです

    失礼します。 私はC言語を勉強し始めて3週間の超初心者なのですが、今関数の勉強をしており、例題でstrcat関数を自作してみようと思っています。  が、作り方が分からず、他のサイト、書物、質問なども参考にしてみましたが説明を読んでも理解できませんでした。 どなたかstrcat関数を初心者にも分かりやすいように自作例を作っていただけると大変幸いです。できるだけ簡単で分かりやすいコードなら助かります。 宜しくお願いいたします。

  • 2分探索木、挿入

    行き詰まりました。 2分探索木の要素挿入です。 何がいけないのでしょうか?? 思うように動作しません。 ルートはどうやら設定されるようですが、 その他のデータがうまく挿入されません。 たぶんポインタの使い方がなってないようなのですが、 どこをどうしていいか分からないのでどなたか教えてください。 (インデントくずれました・・・見にくくてすみません) データ構造は以下の通りです。 node{ key //item template ですがint とみなしてください。   node *left //左の子へのポインタ   node *right //右の子へのポインタ } root{ node *root //ルートへのポインタ } //ここからソース(多少省略してます。) insert(const K & newKey) {     node<K> *temp;     if(empty()){//ルートの設定。         temp = new node<K>(newKey, NULL,NULL);         root = temp;     }else{//木が既存する場合         insertItem(root, newKey);     } } insertItem(node<K> *fact, const K & newKey) {     node<K> *temp,test;     if(fact == NULL){//要素挿入         temp = new node<K>(newKey,NULL,NULL);         fact = temp;         test = *fact;     }else{//挿入場所探索         test=*fact;         if(test.key == newKey){            cout<<"same key";         }else if(test.key > newKey){            insertItem(test.left, newKey); }else{ insertItem(test.right, newKey); } } }

  • パソコンについて詳しくなりたい

    パソコンに詳しくなりたいのですが、どうすれば詳しくれるのでしょうか?今勉強しているのでは、C言語、C++なのですが、パソコンに詳しくないので、C言語、C++は難しいとは思うのですが。。。C言語についてのパソコンについてこれは知っておいたほうがいいような何か詳しくなれるサイトや本があれば教えてください。

  • C言語でタグの抽出について

    main関数で定義した文字列 "<pro><name>chad smith</name><id>1234</id><live>America</live></pro>" があり第一パラメータで検索したいタグを入力すると その中身を表示するプログラムを作成したいと思います。 >>プログラム名 id 1234 >>プログラム名 name chad smith >>プログラム名 pro <name>chad smith</name><id>1234</id><live>America</live> のようになります。 自分なりに作成したのが以下の通りです。 #include<stdio.h> #include<string.h> #define BUF 256 int main(int argc ,char *argv[]) { char str1[]="<pro><name>chad smith</name><id>1234</id><live>America</live></pro>"; char *p1, *p2; int length; if(argc != 2) { fprintf(stderr,"\nUsage :プログラム名 検索したいタグ名\n"); return 1; } p1 = strstr(str1, argv[1]); if(p1==NULL) { fprintf(stderr,"\n検索したタグは見つかりませんでした。\n"); return 1; } length =strlen(argv[1]); p2 = strstr(p1 + length, argv[1]); fprintf(stdout,"\n%.*s\n", (p2-2) - (p1+length+1), p1+length+1); return 0; } 一応自分の期待通りに実行されますが あまり自分の中では良いプログラミングではないような気がします。 後半の部分の(p2-2) - (p1+length+1), p1+length+1あたりがわかりづらいと思います。 もっと良い方法がありましたらよろしくお願いします。

  • strcpy(&... のような記述ができるのか

    現在C言語を習っている専門学校生です。 基本情報技術者を受けようと思い、以前に知り合いから貰ったアイテックの 予想問題集2005春をやっていましたが、その中に、 「単語を行末できれないように英文を出力する」という関数についての 問題がありましたが、 そこでstrcpy(&...という表現があり、ずっと勉強につかってきた「独習C 第3版」 ではこういう記述がなかったので、こういう記述は現実にあるのかどうか わからなく、ずっと悶々としておりましたが、いい加減に自己解決できそうになく、 今回投稿させていただきました。 以下がそのプログラムの一部を抜き出したものです。 #include <stdio.h> #include <string.h> #define BUFFMAX 1024 #define WORDMAX 16 void wordwrap (char str[], int max) { char word[BUFFMAX / 2][WORDMAX], buff[BUFFMAX]; int leng[BUFFMAX / 2], i, idx, cnt, pos; /*文字列を単語に分解する*/ ... /*出力する*/ ... i = pos = 0; while (i <= idx) { if ((pos + leng[i]) > max) { buff[pos - 1] = '\0'; printf("%s\n",buff); pos = 0; } strcpy(&buff[pos], word[i]);   ... } 事前にネットで「strcpy(&」で検索をしてみましたが、RSSリーダーを作るという記事(http://www.okisoft.co.jp/esc/tsu/make_rss_reader_7_003.html)でそれでも「strcpy( &(buf[i]), "月" );」などの表現はありましたが、疑問の解決には至らず、今はこの問題を作成した人が血迷っただけなのかな・・・とかしか考えていません。 どうかお時間のあるときで結構ですので、お答えいただければ幸いに思います。 どうかよろしくお願いいたします。

  • s[]とか *sとかの違い

    C言語で 引数に s[]とか *sがありますが、 厳密にどう違うのでしょうか? あと書き方なのですが、int *sと int* sを見ますが、 正しいのはどちらでしょうか? 細かい話ですが、これらを知らないと、あとで困るような場面も知りたいです。 void test(int s[]) { } void test(int *s) { } void test(int* s) { }

  • メモリ確保エラー時の効率的な書き方

    mallocなどで複数の変数に対してメモリを確保する場合があると思います.例えば3つの変数の場合, char *a, *b, *c; a = (char *)malloc(100); if(a==NULL){ /* メモリ確保できなかったとき */ return (-1); } b = (char *)malloc(100); if(b==NULL){ free(a); return (-1); } c = (char *)malloc(100); if(c==NULL){ free(a); free(b); return (-1); } 変数が多くなるにつれて後から確保する変数のエラー処理(すでに確保したメモリのfree)が増えてしまうので,何か良い方法(コードが短くなるような)はないでしょうか?

  • リエントラント関数

    はじめまして。 複数のタスクで利用されるような関数を作成しようと思っています。 この関数をFuncAとします。 void FuncA() {   int a;   int b;   int c;   処理1;   処理2;   処理3;   処理4; } タスクは優先度低のタスクAと優先度高のタスクBがあるとします。 タスクAがこのFuncAの処理2を行っている最中に、 タスクBがこのFuncAを呼び出すとタスクBで先にFuncA処理をしてから、 タスクAに戻って続きの処理3を行うと思います。 このとき、タスクAで使用していたローカル変数a,b,cはどっかに退避されているのでしょうか?

  • チャットプログラミング

    簡単な接続型チャットプログラムを作っています。 サーバとクライアントをTCPを使って接続し、1対1でメッセージを送りあうというものなのですが、 自宅にPCが一台しかないのでサーバ、クライアントを同じPCで起動してテストしています。 クライアントで接続相手を指定するとき、自PCのローカルアドレスを入力すると、正常に動作するのですが、 グローバルアドレスを入力すると正しく接続できません。 ポート開放についてはhttp://www.akakagemaru.info/port/tcpport.phpのサイトで確認済みです。 パーソナルファイアウォールの設定も済んでいるはずです。 どこがいけないのでしょうか? <環境> Windows Vista VC++ EE