C言語について質問です。


C言語を学びたいと思います。
ですが現状ではCやC++等の区別もあまりついてません。
目標はVB等のようにランタイムなどを使用せず単体で動作する
ネットワークツールなどを作る事を目標としております。

現在私が使えるのはHTML、Perl、PHP、VBをそれぞれ少しずつ使える程度です。

このような私が目標を達するためにお勧めの書籍やサイト、また学習方法などあれば教えて下さい。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2007/12/06 23:00:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答15件)

id:hrkt0115311 No.1

回答回数892ベストアンサー獲得回数51

ポイント14pt

id:quocard さん、こんばんは。


私はプログラミングをしませんが、 YukiWiki などの使い勝手の良さから、結城浩さんのサイトに親近感を覚えています。Java,Perl,Cと、情報も充実しているのも魅力かと思います。


『新版C言語プログラミングレッスン』

http://www.hyuki.com/lc/

読者の声

http://www.hyuki.com/lc/lcvoice.html


上記書籍のページと、読者の声を紹介させていただきます。少しでもお役に立てば幸いです。

id:quocard

まだ勉強はじめたばかりですがこの方の名前はよく拝見します。

参考にさせていただきます。

2007/12/04 02:35:21
id:hamster078 No.2

回答回数587ベストアンサー獲得回数4

ポイント14pt

「はじめての◯◯」シリーズがいいです。

id:quocard

ありがとうございます。

参考にさせていただきます。

2007/12/04 02:35:33
id:spyglass No.3

回答回数455ベストアンサー獲得回数29

ポイント14pt

HSP(Hot Soup Processor)はいかがでしょうか。

比較的簡単にプログラミングが出来て参考書籍も豊富に御座います。


http://www.onionsoft.net/hsp/

id:quocard

ありがとうございます。

こちらも考慮したのですがやはり昔からあるようなもので

基礎を固めたいと思っております。

2007/12/04 02:36:17
id:garyo No.4

回答回数1782ベストアンサー獲得回数96

ポイント14pt

Programming UNIX Socket FAQ (日本語訳)

http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html

SOCKETプログラミング

http://www.ops.dti.ne.jp/~allergy/socket/socket.html

こんな所が参考になるのではないでしょうか。

でもネットワークツールを作るのならRubyもお勧めですよ。

例えば以下だけでURL先を読んだりできます。同じことをCで組んだら凄いことになります。

require 'open-uri'

open("http://yahoo.co.jp"){|f|

puts f.read

}

id:quocard

ありがとうございます。

Rubyもやろうかとおもっていたのですが、スタンドアロンで動くかというと

少々難しい面もあるのでC言語というものにしました。

まだRuby自体をあまり理解していないのでひょっとしたら解釈がまちがっているかもしれませんが

回答ありがとうございました。

2007/12/04 02:37:27
id:KUROX No.5

回答回数3542ベストアンサー獲得回数140

ポイント14pt

Cプログラミング診断室

http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html#mokuji8

この辺の内容が分かるようになればC言語は理解してると思われます。

---------------

文面からは、Windows系のプログラムだと判断したので、

Visual C++の勉強をしたらどうかなと思います。

やっぱり、C言語で書くというのはどうかなと思うので、

C++もやっぱり勉強すべきかも。

-----------------

■C言語によるTCP/IPネットワークプログラミング (単行本)

http://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3...

#UNIX系だとおもいますが・・。

■WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて (単行本)

http://www.amazon.co.jp/WinSock2%E3%83%97%E3%83%AD%E3%82%B0%E3%8...

#Windowsなら、Windows Sockets APIあたりと使うと思うので、その系統の本を

id:quocard

ありがとうございます。

参考にさせていただきます。

2007/12/04 02:37:47
id:mass3 No.6

回答回数118ベストアンサー獲得回数15

ポイント13pt

「HTML、Perl、PHP、VB」はコンピュータはどう動くのか?を知らなくてもなんとなくプログラムが書けちゃう系の言語ですね。(最近はこちらだけでもプログラマは名乗れるようですが。)

対して、C/C++はメモリがどう使われるかなど、「本当のコンピュータの知識」が無いとまともに動くものは書けません。

まずは本当のコンピュータの知識を身につけてください。

「コンピュータはなぜ動くのか」は良い本です。

http://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%...

内容がかぶる部分もありますが、

「プログラムはなぜ動くのか」も読むとよいと思います。

http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%...

ところで目的は「ランタイムを使わない」ってことなのかな?

WindowsだとC++で書いてもMFCを使っちゃうとランタイムが必要ですよ。

学習目的でUNIX系OSであるLinuxを使ってみるのも良いですね。GUI無しで使ってみるといろいろなことが学習できると思います。

Windowsのように洗練されていない(失礼!)ため、素のコンピュータに触れられる機会が多いからです。ネットワークツールで使うSocketはUNIX発祥です。

コンピュータを使っていたつもりが使わされていただけって気づいたらたいしたもんです。

id:quocard

ありがとうございます。

書店でちょくちょく見かける度に気にはなっていたのですが

今度書店に寄ったときに見てみます。

2007/12/04 02:38:21
id:ardarim No.7

回答回数897ベストアンサー獲得回数145

ポイント13pt

「単体で動作するネットワークツールなどを作る事を目標としております」というのはいいことですね。ぜひ頑張ってほしいものです。


ただ「ランタイムを使用せず」というのがあまり明確ではないですね。

MFCランタイムも使わないと言うことであればいわゆる「Visual C++」は基本的に駄目ですね。MFCが前提なので。


いまどき巷に出回っているVisual C++の本は当たり前のようにMFCしかないんですよね~。

私のように WinMain から直書きしなきゃ気がすまない人は立場が狭いもんです。


このあたりが参考になるかもしれません。

C言語で始めるWindowsプログラミング

ちょっと見てみましたが細かいところまで結構行き届いていてわかりやすいと思います。


私などは当時この辺にお世話になったもんですが、さすがに10年前の本ですからね。内容的には今でもWindowsXPやVistaでも十分に使える基礎的知識ではありますが、最新のトピックを含んでいませんのであまりお勧めはできません。

id:quocard

すいません。

C言語という部分についてはかなり初心者なものでして

MFC自体もランタイムと言えばランタイムですね。

おおまかな認識で

VBはWindowsにデフォルトでランタイムが入っていないので意識して入れる必要あり

CはMFCというランタイムを使うがたいてい入っているのである程度はスタンドアロンで使える

という勝手な認識でした。

まだまだ初心者なので間違っているかもしれませんが・・・・

2007/12/04 02:40:32
id:akhrnet No.8

回答回数10ベストアンサー獲得回数0

ポイント13pt

C 言語を学ばれるのであれば,林晴比古さんの

新C言語入門 ビギナー編

http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9...

をお勧めします。

この本を読まれた後に,同シニア編に進まれるとよいでしょう。

また,別のシリーズとして同じ林晴比古さんが書かれた C++ の本もありますが,

こちらを読まれる前に,C の本を読まれるほうがよいかもしれません。

id:quocard

いろいろな方がC++をやる前にCをやったほうがよいと言われています。

まだCとC++の差もよく理解できていないですが、検討したいと思います。

2007/12/04 02:41:25
id:lichten No.9

回答回数6ベストアンサー獲得回数0

ポイント13pt

http://www.kouno.jp/home/c_faq/

C言語を知らず、C++から始めてもよい、という意見もあるんですが、自分はC言語をよく知ることから始めることをお勧めします。他人のC++のソースを読むとき、大抵Cの深い知識が必要になるからです。

プログラミング言語C(書籍)と C言語FAQ(リンクしました) を理解できれば、一通りわかっていると言ってよいと思います。これらは学術的な書かれ方をしていて、わかりにくいという意見もあります。Perlなどが分かるなら、入門書から始めるのは遠回りのように思いますが、個人差があるので色々御自分で試してみて下さい。

「ランタイムなどを使用せず」というのは無理です。C/C++の標準に、ネットワーク系の関数が無いからです。たとえばWindowsなら、Winsockライブラリが使用できるので、それを利用することになります。KUROXさんの回答にある本が良書です。

id:shinfukui No.10

回答回数7ベストアンサー獲得回数1

ポイント13pt

WindowsプログラミングをCでされるということなら、素直にVisual C++でMFCを使われることをお勧めしますが、個人的にはMFCはオブジェクト指向ライブラリとしてはかなりいびつなものだという印象があります。

私がお勧めするのは、Borlandの「Turbo C++」です。Express版なら無料でダウンロードできます。

http://www.turboexplorer.com/jp/cpp

MFCに相当するVCLというライブラリが使えますが、このライブラリはとても美しいオブジェクト指向構造を持っています。

ただ、作りたいのが「ネットワークツール」とのことですので、まずはgaryoさん、KUROXさんが挙げられているネットワークアプリケーションの知識から入った方が良さそうです。

一度、GUIなしで、コマンドライン上から操作するCUIアプリケーションを作ってみて、そこでネットワーク・プログラミングの基本を覚えるのが結局のところ近道ではないかと思います。GUI周りはそれだけで独特のプログラミングスタイルを学ぶ必要がある(VBの世界とは別世界です)ので、ネットワーク・プログラミングとは分けて学習すべきです。

が、その次にGUIを使ったプログラミングをすることになった際に、MFCか、VCLか、又は他のUNIX系ライブラリか、といった選択をすることになるかと思いますので、安易に開発ツールを選ぶと、後で後悔することになるかもしれません。

まずは良い本を探し、そこで採用されている開発環境からスタートするのも一つの手かと思います。

id:quocard

ありがとうございます。

同じC++でもMicrosoftの出しているものやDelphiなどいろいろあるみたいですね。

どちらで作っても同じものを作れると思うのですが

これらのソフトの違いというのは何になるんでしょうか。

2007/12/04 04:13:05
id:mach29 No.11

回答回数1ベストアンサー獲得回数0

ポイント13pt

WindowsでC言語の標準関数(mallocなど)を使うとCRT(Cラン

タイムライブラリ)が呼び出されてしまいます。

目標がランタイムを利用しないツールを作ることのようなので、

C言語の関数に対応するWinAPIを学ぶ必要があると思います。

まずはC言語の文法を学び、次にWinAPIを学ぶといったことに

なると思います。

C言語については皆さんが挙げられている本、WinAPIについては

MSDNなどを参考にされるとよいと思います。

また、ネットワークプログラミングでは、UNIX互換API、WinAPIが

利用できますが、やはりWinAPIを利用する必要があります。

KUROXさんが挙げられている「WinSock2プログラミング」が参考に

なると思います。

あと、コンパイル時にCRTがリンクされないようにビルド設定を

工夫する必要があると思います。(私はやったことありませんが・・・)

id:scmiz No.12

回答回数5ベストアンサー獲得回数0

ポイント13pt

0からのゲームプログラミング ~ ゲームプログラマーへの第一歩を踏み出そう ~

http://www.plustarnet.com/aspil/Programming/


ネットワーク関連の記述はないですが、

私がC言語を独学するときに参考にしたサイトです。


ゲームプログラミングという題ではありますが、

一般的なC言語の基礎知識がしっかりおさえられていて

文章もわかりやすいので重宝しました。

他の言語との違いを理解しながら基礎を学びたいなら役に立つと思います。

id:quocard

ありがとうございます。

実際にこういった判りやすい題材を作りながら勉強するのは

実際に進んでいるという実感が得られてよいかもしれません。

ゲームというのは非常に興味があるので参考にさせていただきます。

2007/12/04 02:45:22
id:ichy No.13

回答回数2ベストアンサー獲得回数0

ポイント13pt

C、C++ともに柴田望洋さんの著書がおすすめです。

プログラミング言語教育のあり方を研究題材にしてらっしゃる大学の先生で、著書の作りは非常に練られています。

「明解C++」、「明解C言語入門編」、「明解C言語実践編」


とはいっても、PerlやVB等の経験は既にお持ちで、しかもネットワークプログラムを作りたいという既に具体的な目標も持っておられるので、先の回答者さんたちがおすすめするようなソケットライブラリの解説書・サンプルプログラムを参考にどんどん手を動かして行けば自然と身に付いていきそうな気がします。チャットソフトとかFTPもどきが題材としておすすめです。

C、C++で一番難解だと皆さんが口をそろえて言うポインタ操作もおそれずはじめはメモリリークを起こしまくるようなプログラムをどんどん書いていけばいいと思います。そのうち、何かがおかしいと気づき始め、C言語の解説書を手にとって詳細なポインタ操作の文法の理解をしなければならなくはずです。

そして、ポインタ操作関連の文法を重箱の隅を突っつくぐらいに極めたら、結局ポインタ操作っていろいろできるけど、普段のプログラムでは数種類のイディオム(慣用表現)しか使わないもんだなって気づくようになります。そこまで達したら、おそらくC言語プログラマーとしてはかなりのレベルになってると思います。

ポインタ操作関連専用の書籍もあるので、ポインタ理解に行き詰まったら、そちらも参考になれることをおすすめします。

「C言語 ポインタ完全制覇」前橋 和弥著

id:t_ishida No.14

回答回数18ベストアンサー獲得回数0

ポイント13pt

言語なんて基本的にはどれも一緒ですので、

それだけの言語を読めるのであれば、

http://code.google.com/intl/ja/

で、やりたい事やってるソースを読むのが良いでしょう。

コンピュータの気持ちが分からない人であれば、

ポインタ、メモリアロケーションのことなんかは、

事前になんらかの情報を掴んでおいた方が良いかも知れませんが。

ところで、ネットワークツールと言うのが何かが分からないのですが、

ソケット通信で作るクライアント?

ポートを監視して待ってるdaemon?

いずれにせよある程度のものならば、

Perlでイケちゃうんじゃないかと思います。

むしろ性能的にクリティカルな何か、

とか、コンピュータネイティブな何か、

とか、じゃないのにC言語を使うと言うのは、

色々面倒くさいし、取り扱い注意な代物なので、

僕的にはマゾい感じなのでオススメできかねますが・・・

(C言語は好んで使わない人なので・・・)

最終目標とはずれますが、オススメの書籍としては、

以下のものを挙げておきます。

OS自作入門

CODE READING

id:Makoto1984 No.15

回答回数1ベストアンサー獲得回数0

ポイント13pt

個人的にはWindowsで使うものを作るならばVisual Studioを使って作るほうがいいかと、

今のところ 英語版Visual Studio2008は完成しているようですが、日本語版はベータバージョンか2005しかありません。

最新情報 -> Visual Studio ホームページ

無料版は -> Visual Studio 2005 Express Edition

ただ、Visual C++ Express2005のみではネイティブなGUIアプリは作れません。(.NET2.0を使ったアプリなら出来ますが)

もしGUIアプリを作りたいのであればPlatform SDKをインストールするか、Standard Editionを買うしかなありません。

詳しくは -> Visual Studio 2005 Express Editions: Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う


他には、Cygwin+Eclipse C/C++ Development Tooling - CDTを使ってみるとか・・・

Eclipseは本来Javaの開発環境ですがCDTがあればCのプログラムも組めます。

ただ、Eclipseは、Javaの仮想マシン上で動くので、Java入れないと動きません。

当然ですがCで書いたアプリケーションはコンパイルすればJava無くても動きます。


参考になりそうな物としては、既に紹介されてますが、林晴比古さんの本で『新C言語入門 ビギナー編』『新C言語入門 シニア編』、

あと、猫でもわかるプログラミングなんかはどうでしょう。

ネットワークに関しては、ちょっと詳しくないのでなんともいえません。

さらに詳しいことを知りたくなったら、MSDNやネット上を検索すればかなりの情報が出てきます。


もし、どうしてもC言語をということでなければですが、VB少し使えるということなので、ActiveBasicという選択肢もあるかと、ActiveBasicはBasicなのにネイティブアプリケーションが作れてしまうという代物です。Windows API使って開発できるらしです。(自分は使ったことですが・・・

今のところ ActiveBasic5.0は開発中らしいので、実用向きでは無い気がしますが、前のActiveBasic4.xもダウンロードできるので、そちらを使って見るのも手かと

activebasic.com - ActiveBasic公式サイト


ここからは私的な意見ですが、

最近Windowsはネイティブアプリというより、.NETな感じがします。Vistaには.NET3.0が標準で搭載されてるらしいので、.NETアプリケーションでもそのまま使えるようにようですし。.NETであればメモリリークの心配もありませんし、(絶対ではないらしい?



参考

Cygwin - Wikipedia

Eclipse (統合開発環境) - Wikipedia

  • id:ttamo
    作りたいようなものを読めばいいのでは?
    ネットワークツールって何のことか知りませんが
    inetd とか telnet とか netcat (nc) とかの
    ソースを読むことから始めてはいかがでしょうか。
    http://www.amazon.co.jp/dp/475614389X

  • id:garyo

    コンパイラに何を使うかでだいぶ変わるかも。
    最近は純粋なCコンパイラはまず入手できないのでC++コンパイラを使うことになると思います。
    無料がいいのであれば
    Windows系 VisualC++
    GCC系 MinGW,Cygwin
    が主になると思います。(ボーランドも無料で公開していますが)

    CUIのツールを作成するのであればCygwinなどお勧めかも知れません。
    Linuxと同じGCCが使えるのでLinux上でもプログラムが組めるようになります。
    windows用にはコンパイル時にgcc -mno-cygwin で動くと思います。

    GUIを使う場合はCygwinはあきらめてVisualC++を選んだ方がいいと思います。
    その場合C用のグラフィックライブラリはあまりないので
    C++の勉強そのものになると思います。

    まとめると
    CUI
    Linuxにも興味
      Cygwin
    Windowsのみ
      MinGW
    Visual C++
    GUI
    Visual C++

    こんな感じでしょうか。
    個人的なお勧めはCUIでCygwinです。
  • id:lichten
    自分の回答を見直して、気になったので補足します。今時のWindows環境で、ソケットが使えないというのは聞いたことがありません。Winsockの参考書を見ながらプログラムを作れば、あたかも(?)ランタイムが必要ないかのような実行ファイルが出来ると思います。MFCを使う場合も、MFCを静的にリンクする事で、ランタイムがいらないような感じになります。
    ただ周りの方たちも書いていますが、MFCのソケットクラスはお勧めできません。自分は使わないようにしているので実経験ではないのですが、バグバグらしいですよ。
  • id:garyo
    >Rubyもやろうかとおもっていたのですが、スタンドアロンで動くかというと
    >少々難しい面もあるのでC言語というものにしました。
    質問からおそらくOSはWindowsだと思いますが、
    Rubyの場合 exrbというツールを使えば、exeファイルにすることができます。
    rubyをインストールしていない人に使ってもらう時に良く使う方法です。

    以下の「ActiveScriptRuby」には標準で入っています。
    http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/
    インストールすると「rb2exe」というユーティリティが入ります。

    また「Formdesigner for VisualuRuby」というツールを使えばVBライクにフォームに部品を貼りつける形でGUIのプログラムが作れます。
    http://homepage3.nifty.com/Yukimi_Sake/ruby/formdesigner/fdvr040303.zip

    「Rubyネットワークプログラミング」という記事を参考にされるといいと思います。
    http://www.geekpage.jp/programming/ruby-network/


    例えばRubyとCで送られた文字を大文字にして返すサーバーソフトを比較すると
    こんな感じになります。
    -(Ruby)-------------------------------
    #!/usr/bin/ruby

    require "socket"
    s = TCPServer.open(30000)

    sock = s.accept

    while s = sock.gets
    sock.puts s.upcase
    end
    sock.close

    s.close
    --------------------------------


    -(C言語)-------------------------------
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    #include <windows.h>
    #include <winsock.h>
    #define perror(_Z) fprintf(stderr, "%s error\n", _Z)
    #define herror(_Z) fprintf(stderr, "%s error\n", _Z)
    #define exit(_Z) WSACleanup();exit(_Z)
    #define close(_Z) closesocket(_Z);

    #define BUFSIZE 1000
    #define DEFAULT_PORT 30000

    main(int argc, char *argv[])
    {
    struct sockaddr_in client, server;
    int s, rs, port, len, i, n, pn;
    char buf[BUFSIZE], ip[20];

    WSADATA wsaData;
    if (WSAStartup(0x0101, &wsaData) != 0) {
    fprintf(stderr, "Winsock Error\n");
    exit(1);
    }

    port = DEFAULT_PORT;

    if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket");
    exit(1);
    }

    memset((char *) &server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(port);

    if (bind(s, (struct sockaddr *) &server, sizeof(server)) < 0) {
    perror("bind");
    exit(1);
    }

    listen(s, 1);

    len = sizeof(client);
    if ((rs = accept(s, (struct sockaddr *) &client, &len)) < 0) {
    perror("accept");
    exit(1);
    }
    strcpy(ip, inet_ntoa(client.sin_addr));
    pn = (int)ntohs(client.sin_port);
    while ((n = recv(rs, buf, BUFSIZE-1, 0)) > 0) {
    buf[n] = '\0';
    fflush(stdout);
    for(i = 0; i<n; i++)
    buf[i] = toupper(buf[i]);
    fflush(stdout);
    send(rs, buf, n, 0);
    }

    close(rs);
    close(s);
    exit(0);
    }
    --------------------------------

  • id:garyo
    >同じC++でもMicrosoftの出しているものやDelphiなどいろいろあるみたいですね。
    >どちらで作っても同じものを作れると思うのですが
    >これらのソフトの違いというのは何になるんでしょうか。
    Cは基本文法を単純にしているため、標準機能ではほとんど何もできず、ライブラリで機能拡張がしてあります。
    各コンパイラ毎にライブラリが異なるため、「Cという文法」レベルでは互換性があっても、ライブラリレベルでソースの互換性が無くなります。
    そのため、「サンプルソースの入手性」や解説書の多さを考えてメジャーなコンパイラを選ぶといいと思います。
    情報が多いのはVC++かgccでしょうね。
  • id:Kumappus
    予備知識があまりなくて、Windows用で、さらに今からやるんなら条件(ランタイム云々)にはあってないかもしれないけどC#のほうがいいですよ。

    ポインタとかメモリ管理とかめんどくさいこと一切なし(笑)。あんなもんはコンピュータがお馬鹿だった時代にプログラマが苦労してただけで昔の車にはクラッチがなくて回転数合わせてギアシフトしたもんだ、とか自慢するようなもんで、クラッチどころかオートマが主流の現在ではそんなことやっても実用上何らメリットがないのと同じ。

    おまけに無料のExpress版でもそこそこ実用になるし、IDEのオートコンプリーション機能が強力だし。
    できあがったものの実行速度などには多少難点が(特にXPで起動時)あるけど、今後Windowsアプリのスタンダードになるのもほぼ決まりだし。
    さらに言うと関数型言語のフレーバーさえ漂わせはじめていますからね…。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません