aris-wiz の回答履歴
- TCP/IP通信型大文字・小文字変換プログラム
TCP/IP通信型大文字・小文字変換プログラムを作りたいです。 しかし、うまく2つのプログラムが接続されません。 恐らく、IPアドレスやホスト名の問題だと思います。 超初心者でそこのところをあまり理解していません。 どなたかプログラムの補足をお願いします。 概要は ・クライアント キーボードから文字列を入力し、サーバーに送信。 サーバーから送信された文字列を画面に出力。 ・サーバー クライアントから送信された文字列に対し、 大文字は小文字に、小文字は大文字に変換して返す。 クライアント側プログラム #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #define SOCK_NAME "./socket" int main() { struct sockaddr_in saddr; int soc; char buf[1024]; if ( (soc =socket(AF_INET, SOCK_STREAM, 0 ) ) < 0 ) { perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=inet_addr("192.168.1.1"); saddr.sin_port=htons(1357); if(connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("connect"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", soc); while(fgets(buf, 1024, stdin)){ if(buf[strlen(buf) -1] == "\n") buf[strlen(buf) -1] = "\0"; write(soc, buf, 1024); read(soc, buf, 1024); fprintf(stdout, "%s\n", buf); } close(soc); return 0; } サーバー側プログラム #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define SOCK_NAME "./socket" int main() { int i; int fd1, fd2; struct sockaddr_in saddr; struct sockaddr_in caddr; int len; int ret; char buf[1024]; if((fd1 =socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=INADDR_ANY; saddr.sin_port=htons(1357); unlink(SOCK_NAME); if(bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("bind"); exit(1); } if(listen(fd1,5) < 0 ) { perror("listen"); exit(1); } while(1){ len = sizeof(caddr); if((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0){ perror("accept"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", fd2); while((ret = read(fd2, buf, 1024)) > 0 ){ fprintf(stderr, "read: &s\n", buf); for(i=0; i<ret; i++) if(islower(buf[i])) buf[i] = toupper(buf[i]); if(isupper(buf[i])) buf[i] = tolower(buf[i]); fprintf(stderr, "write: %s\n", buf); write(fd2, buf, 1024); } close(fd2); } close(fd1); return 0; }
- ベストアンサー
- C・C++・C#
- noname#61460
- 回答数2
- またまたテストの復習なんですが・・・
処理内容 基数、および変換対象数値(10進数)を入力させ、それに応じた基数変換を行う。その結果を画面に出力する。 ソースプログラム #include<stdio.h> #define MAX_OUT (16) int InputNum(int, int); char ChangeNum(int); /* メイン処理 */ main(){ int i; /* カウンタ */ int num; /* 対象数値 */ int num_base /* 基数 */ int num_next, num_out; char str[MAX_OUT]; /* 変換後文字格納用 */ while (1){ printf("基数を入力してください(2~32)\n"); printf("(2~32以外の入力で終了)\n"); num_base=InputNum(2,32); if (-1==num_base) { break; } printf("対象の数値を入力してください(0~65535)\n"); printf("(0~65535以外の入力で終了)\n"); num=InputNum(0,65535); if (-1==num) { break; } /* 変換開始 */ ( 1 ) for (i=0; i<MAX_OUT; i++){ /* 変換終了か判定する */ if (num_base>num_next){ /* 変換後文字の格納 */ str[i++]=ChangeNum(num_next); break; } /* 数値文字を抽出 */ num_out=( 2 ) str[i]=ChangeNum(num_out); /* 次の行へ */ num_next=( 3 ) } /* 変換結果を出力 */ printf("対象数値%dの%d進数表現は\n",num, num_base); for (i -= 1; 0<=i; i--) { printf("%c", str[i]); } printf("\nです\n"); } printf("終了します\n"); } /* 数値入力処理 */ int InputNum(int min, int max){ int ret; scanf("%d", &ret); if ((min>ret) || (max<ret)){ ret=-1; } return ret; } /* 数値を文字に変換 */ char ChargeNum(int num){ char ret=0; if (10>num){ ret=num+'0'; } else{ ret=( 4 )+'A'; } return ret; } という問題なんですが、(1)~(4)の答えと説明をどなたかして頂けないでしょうか?どうぞよろしくお願いします!ちなみにwhile(1)は無限ループです。
- 締切済み
- C・C++・C#
- mimasaka12
- 回答数2
- Visual Studioで作られたプログラムを読みたいです
都合により、他人がVisual Studioで作ったC++のプログラムを理解しなければならなくなりました。 C言語はごく一般的な内容ならば理解できますし、C++もある程度はわかるのですが、どうもVisual Studio特有の作成、記述方法?のようなものにはまってしまい、まったく進まないのが現状です。 どなたか、Visual Studioで作られたプログラムの総合的な解説を行っているサイトなどを紹介していただけないでしょうか?できれば初心者向けの内容でお願いいたします。
- 締切済み
- C・C++・C#
- alphaomega
- 回答数1
- 配列のサイズを動的に拡張
お世話になっております。 配列のサイズを動的に拡張について悩んでおります。例えばint x[5]という配列があって、データが埋まったら動的にx[6]にする・・ っといったものです。自分で試行錯誤した結果、以下のようなプログラムを作成しました。 int *data,count=0,num=10;// グローバル変数 // 配列にデータを加える関数add void add(int t){ if(count+1>num){ // サイズを超えたら配列をサイズを+1 int i,*tmp_data; tmp_data = new int [count]; for(i=0;i<num;i++) tmp_data[i] = data[i]; // 一時的に保存 delete[] data; // 古いのを消す data = new int [num+1]; // 新しく作る for(i=0;i<num;i++) data[i] = tmp_data[i]; // 新しいのにコピー num+=1; // 最大値をプラス data[count]=t; delete[] tmp_data; } else data[count]=t; count++; // 入力されたカウントをプラス } main関数内で、data = new int [10];と宣言し、add(3);のように使用しています。またnewのメモリ確保のエラー処理は省いております。 動くことは動くのですが・・ご覧の通り、グローバル変数が3つになり、データをコピーしたりと、複雑になってしまいました。 もっと簡単に出来るのでは・・っと思い質問させて頂きました。 こうすれば、もっと簡単になるよ!など。。ご回答頂ければ幸いです。
- 締切済み
- C・C++・C#
- noname#138858
- 回答数3
- カメラで撮影した画像を解析するためのプログラムの作成についての質問です。
カメラで撮影した画像を時系列解析するためのプログラムを作成しているのですが、 原因不明で正常作動しません。 そのようなプログラムの作成に詳しい方がいらっしゃったら 相談に乗って頂けませんでしょうか? よろしくお願い致します。
- なぜ2回表示されるのでしょうか?
このたび、諸事情によりC言語から再入門中です。 VisualC++2005を使っています。 do~while文を用いて、キーボードから'q'が入力されるまで、 画面に"qを入力して下さい"と表示し続けるプログラムを 作成してみました。 #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> // キーボードから'q'が入力されるまで、画面に"qを入力して下さい"と表示し続けるプログラム int main(void) { char c = '\0'; do { printf("qを入力して下さい\n"); scanf("%c", &c); if (c == 'q') { break; } }while(1); return 0; } 実行してみると、以下のように動作します。 1."qを入力して下さい\n"が表示される 2.'a'を入力してEnter 3."qを入力して下さい\n"が2行表示される おそらく、2の際に、'a'と'\0'を受け取ってしまい、 それが3の原因になっている気がします。 でも、scanfで"%c"を指定しているのに、こんなこと あり得るのでしょうか? 仮にソースに誤りが無かった場合、 たかが演習とはいえ自分としてはこの動作を回避したいのですが、 どういった対策があるのでしょうか? 初歩的な質問で申し訳ありませんが、よろしくお願いしますm(__)m
- ベストアンサー
- C・C++・C#
- noname#32133
- 回答数2
- 16進法を10進法に
16進法を10進法にするにはどうしたらいいんでしょう? 10進法→16進法はわかるのですが。。。 プログラムものせていただけるとありがたいです。
- 締切済み
- C・C++・C#
- horininnna
- 回答数6
- 16進法を10進法に
16進法を10進法にするにはどうしたらいいんでしょう? 10進法→16進法はわかるのですが。。。 プログラムものせていただけるとありがたいです。
- 締切済み
- C・C++・C#
- horininnna
- 回答数6
- すごく困っています;;
下記のプログラムの組み方が、手元の参考書をいくら読んでも分かりません・・・。 とても困っておりますので、どなたかご教授いただけないでしょうか? char a; char b[o]; short c; int d; float e; double f; 上記の各変数(配列の場合は各要素)のアドレスを16進数で表示しなさい。 また変数(配列の場合は配列全体)のサイズを10進数で表示しなさい。
- 汎用系に就職する人は
いつもお世話になっております。 未経験ながらプログラマを超見習いから、として採用して頂きました。 しかし、よくよく見てみると汎用系の会社のようです。 汎用系オープン系すら知らずに情熱だけで取って頂いたようなもので、反省していますが、せっかくなので頑張ってみようと思います。 私は就職活動のかたわら独学でC言語を勉強していたのですが、C言語はオープン系の言語という事で間違いないでしょうか? となると、汎用系に行くとなるとC言語は無駄になるということですよね。 やっとC言語が面白くなってきたところでしたので、ちょっと残念です。 入社までまだ時間があるのですが、少しでも勉強しておきたいもので、何を勉強しておくべきかアドバイスを頂ければと思います。 コボルという言語が汎用系のメインのようですが、C言語とは全く別物なのでしょうか? あと、汎用系で経験を積んだとして、オープン系の仕事には関わるようにはなれないのでしょうか?(つまり、汎用系とオープン系は全然違う分野なのでしょうか?)
- memset関数について
c始めたばかりなのですが、 chra y[100]; memset(y,'1',99); 文字列のmemset関数で初期化したとき y[99]にはNULL文字が入るのでしょうか?? printfでの%sはNULL文字まで表示ということなのでしょうか?
- プロセスのファイルディスクリプタ(Windows)
#include<stdio.h>と記述すると実行時に標準入出力が オープンされますが、標準出力がcommand.exe上に出力される仕組みが いまいちよくわかりません。どなたか詳しく教えてもらえないでしょうか
- VS2005 での修正
VC++6.0 から VS2005 への変更で困っています。 char header[0x4000]; のとき、 第2引数は sprintf_s( header, 0x4000-1,"Content-description:" ); strcat_s( header,0x4000, tmpstr1 ); strcpy_s(header,0x4000, tmpstr1); とするのでしょうか? それとも、すべて 0x4000 とするのでしょうか? 1000箇所を超える修正で泣いています。 マイクロソフトさん、かんべんして!! よろしくお願いします。
- 変数の前についているnってもしかしてint型を示しているのでしょうか?
変数の前についているnってもしかしてint型を示しているのでしょうか? long型ならl, bool型ならbを頭に付けるのは分かるのですが,intはiでないのでしょうか? また、それぞれの型と、接頭語の対応も教えていただけないでしょうか? int nLen; // intのn? long lHeight;// longのl bool bStart; // boolのb これまで気にしてなかったのですが、自分でlong型にはlを付けているので、 全て書式を統一した方が良いかな、と思い質問しました。
- 静的変数の大量な要素を初期化したい
言語:c OS:Windows XP 処理系:Borland C++ Compiler 5.5 静的変数の大量な要素を-1で初期化したいのですが、 どのようにかけばよいでしょうか。 static int a[1000] = {-1, -1, /* ←これをたくさんかくしかないでしょうか */
- Win32APIは覚えて損する?
Win32APIは現在一般的に出回ってる32Bit版Windowsの ApplicationProgramingInterfaceですよね? これがそのうち一般的に出回るのが64Bit版Windowsに なったときもWin32APIを勉強したときの知識は役に たつのでしょうか? またWin16→Win32に変わったときはどのような感じだ ったんでしょうか? あと少々質問とずれてしまいますが○○Bit版Windowsの [○○Bit版]はどのような意味を持つのでしょうか? 暇なときにでも回答できたらお願いします ※ ○○=16 or 32 or 64 など
- ポインタのアドレスの不変的な性質?
最近奇妙な現象?に遭遇しました。 理解している人には笑われるかもしれませんが・・・・ ソースを以下に示します。 #include <stdio.h> void function(int *pointer); void main(){ int sample=3; int *pointer; pointer=&sample; function(pointer); printf("%d\n", *pointer); } void function(int *pointer){ int temp=9; pointer = &temp; } 今上のソースとは別のプログラムを作成中で、上のような状態になっています。関数にポインタのアドレスを渡し、関数の中でアドレスを書き換えて表示を違うものにしようと考えました。 上の表示結果は3になります。なぜなのでしょう? そして目的を達したいため、上のように関数内でのアドレスの書き換えが呼び出し側に反映されるようにすることができないでしょうか? 分かる方はよろしくお願いします。
- 標準入力の際に、、、fgets
標準入力の際にgetsやscanfは読み込むバイト数を指定できないので危険、 fgetsを使えという話を良く聞きますが、fgetsだと改行まで読み込んで しまいますよね。これで少し困っています。 読み込んだ文字列から'\n'を探して'\0'を代入することはできますが 面倒くさいです。もっと手軽にscanfのように改行を含めずに 標準入力から受け付けるのをfgetsなどではどうやればいいのでしょうか。 よろしくお願いいたします。
- 文字列の宣言(ポインタと配列)
Cでソケット通信などはできるくらい(もちろんできると言っても私のレベルで) になりましたが、文字列を宣言する際に char *str = "ahaha'; char str[] = "ahaha"; の2種類の違いが今イチしっくりきません。 いろんな参考書でこれの説明はありましたが、でも結局なんなんだ、という感じです。 ポインタで宣言するべき時、配列で宣言するべきときが判断できません。 またポインタで宣言するとエラーが出るけど試し配列で宣言してみたら なんか知らんが動いた、ということも多々ありましたが理由がよくわからなかったです。 よろしくお願いいたします。