質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

文字列の代入について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 381

MGN6

score 13

ubuntuのサーバとクライアント間で文字列のやり取りを行うC言語のプログラムを作成しているのですが, クライアント側の実行結果が本来なら「sendBuf=[START]」のところ「sendBuf=[STARTFileExit]」と表示され, 以降も文字化けしてしまいます. 以下にソースコードを張り付けるので, 原因がわかる方は教えてください.

クライアント側

include <sys/types.h>

include <sys/socket.h>

include <stdio.h>

include <netinet/in.h>

include <arpa/inet.h>

include <sys/un.h>

include <unistd.h>

include <stdlib.h>

int main(){

int sockfd;
int len;
struct sockaddr_in address;

int result;
char ch1[5]= "START";
char ch3[4]= "File";
char ch5[4]= "Exit";
char ch2[2], ch4[3];

sockfd = socket(AF_INET, SOCK_STREAM, 0);

address.sin_family = AF_INET;

address.sin_addr.s_addr = inet_addr("172.168.1.11");
address.sin_port = 12345;
len = sizeof(address);

result = connect(sockfd, (struct sockaddr *)&address, len);
printf("Connecting to the Server...\n");

if(result == -1){
perror("oops: client1");
exit(1);
}

printf("sendBuf=[%s]\n", ch1);
write(sockfd, &ch1, 5);

read(sockfd, &ch2, 2);
printf("[%s] from server\n", ch2);
printf("[%s] to server\n", ch3);
write(sockfd, &ch3, 4);

read(sockfd, &ch4, 3);
printf("[%s] from server\n", ch4);
printf("[%s] to server\n", ch5);
write(sockfd, &ch5, 4);

close(sockfd);
exit(0);
}

サーバ側

include <sys/types.h>

include <sys/socket.h>

include <stdio.h>

include <netinet/in.h>

include <arpa/inet.h>

include <sys/un.h>

include <unistd.h>

int main(){
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

char ch2[2]= "OK", ch4[3]= "FIN", ch1[5], ch3[4], ch5[4];

unlink("server_socket");
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

server_address.sin_family = AF_INET;

server_address.sin_addr.s_addr = inet_addr("172.168.1.11");
server_address.sin_port = 12345;
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

listen(server_sockfd, 5);
while(1){
char ch;
printf("server waiting\n");

client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);

read(client_sockfd, &ch1, 5);
printf("[%s] from client\n", ch1);
printf("[%s] to client\n", ch2);
write(client_sockfd, &ch2, 2);

read(client_sockfd, &ch3, 4);
printf("[%s] from client\n", ch3);
printf("[%s] to client\n", ch4);
write(client_sockfd, &ch4, 3);

read(client_sockfd, &ch5, 4);
printf("[%s] from client\n", ch5);
printf("--------------------------\n");

close(client_sockfd);
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

char ch1[5]= "START";
char ch3[4]= "File";
char ch5[4]= "Exit";
char ch2[2], ch4[3];

終端文字が入るように、全て一文字分多く領域を確保してください。
あるいは char ch1[] = "START"; のように省略してしまっても構いません。

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
C

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る