-1

ci で ipc を使用して x&0 ゲームを作成し、3 つの文字配列を宣言し、選択する魔女行を読み取り、x または 0 を配置する位置を読み取ります。クライアントから fifo を介して行番号を送信しようとすると、サーバーが受信しますたとえば、私は 1 を送信し、サーバーは 3144200 を取得します。これはコードであり、1 回の読み取りと書き込みだけではありません。これはサーバーです:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <iostream>

int main() {
HANDLE f1, f2;
DWORD x;
char l1[3]="\0";
char l2[3]="\0";
char l3[3]="\0";
char X='x';
char* a="";
char* lineChar="";
int n=1,lineInt=0,coor=0;
printf("I am the server \n");
printf("You will play with x\n");
// creating pipes
f1=CreateNamedPipe(TEXT("\\\\.\\PIPE\\fifo1"), PIPE_ACCESS_INBOUND,PIPE_TYPE_BYTE|PIPE_WAIT, 3, 0, 0, 0, NULL);
f2=CreateNamedPipe(TEXT("\\\\.\\PIPE\\fifo2"), PIPE_ACCESS_OUTBOUND,PIPE_TYPE_BYTE|PIPE_WAIT, 3, 0, 0, 0, NULL);
ConnectNamedPipe(f1, NULL);
ConnectNamedPipe(f2, NULL);

while(n<=9){
    for(int i=0;i<=2;i++){
        printf("[%s]",&l1[i]);
    }
    printf("\n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l2[i]);
    }
    printf("\n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l3[i]);
    }
    printf("\n");
    printf("You will begin,select the line from 1 to 3 : \n");
    scanf_s("%d",&lineInt);
    x=0;
    lineChar=reinterpret_cast<char*>(lineInt);
    printf("%s",lineChar);
    //strcpy_s(a,sizeof(lineChar),lineChar);
    if (WriteFile(f2,lineChar,sizeof(lineChar)+1, &x, NULL)==0) {
                printf("writing error..%d\n", x);
    }
    n++;
}
DisconnectNamedPipe(f1);
DisconnectNamedPipe(f2);
CloseHandle(f1);
CloseHandle(f2);
}

これはクライアントです:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include<stdlib.h>

int main(){
HANDLE f1, f2;
DWORD x;
char l1[3]="\0";
char l2[3]="\0";
char l3[3]="\0";
char o='0';
char* lineChar="";
int n=1,lineInt=0,coor=0;
printf("I am the client \n");
printf("You will play with 0\n");

    // connect to pipes created by server
f1=CreateFile(TEXT("\\\\.\\PIPE\\fifo1"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
f2=CreateFile(TEXT("\\\\.\\PIPE\\fifo2"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

while(n<=9){
    for(int i=0;i<=2;i++){
        printf("[%s]",&l1[i]);
    }
    printf("\n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l2[i]);
    }
    printf("\n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l3[i]);
    }
    printf("\n");
    x=0;
    Sleep(3000);
    if (ReadFile(f2, lineChar, sizeof(lineChar), &x, NULL)==0) {
                printf("reading error..%d\n", x);
            }
    printf("%s",lineChar);
    //lineInt=atoi(lineChar);
    //printf("\n%d\n",lineInt);
    n++;
}
CloseHandle(f1);
CloseHandle(f2);
}
4

2 に答える 2

1

コード内の文字列とポインターに多くまたは問題があります。

まず、配列内の単一の文字を文字列として出力すると、奇妙な出力が発生します。

第二に、問題の原因の1 つは、文字列の長さではなく、ポインターのサイズを返すWriteFile使用を呼び出すときです。代わりに使用してください。sizeof(lineChar)strlen

問題の 2 番目の原因は、整数を文字列にキャストすることです。これはうまくいきません!何その発言

lineChar=reinterpret_cast<char*>(lineInt);

の値からポインターを作成することですlineIntこれは有効なポインタではありません! それにはいくつかの方法があります。

  1. newstd::to_stringを使用して、値を に変換しますstd::string
  2. とにかくCとC++を混在させるので、あなたも使うことができますsprintf

あなたのプログラムには未定義の動作と呼ばれるものがたくさんありますが、どちらも完全にクラッシュしないことを喜ぶべきです。

于 2012-11-07T06:43:37.603 に答える
0
#include<stdio.h>
#include<string.h>

int main(){
char l1[3]="\0";
char l2[3]="\0";
char l3[3]="\0";
char x='x';
char o='0';
int n=1,lineInt=0,coor=0,next=1;
printf("X & 0 Game :  \n");
while(n<=3){
    for(int i=0;i<=2;i++){
        printf("[%s]",&l1[i]);
    }
    printf("\n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l2[i]);
    }
    printf("\n");
    for(int i=0;i<=2;i++){
        printf("[%s]",&l3[i]);
    }
    printf("\n");
    switch (next){
        case 1 :{
            printf("To select the line enter 1,2 or 3 : \n");
            scanf_s("%d",&lineInt);
            switch (lineInt){
                case 1 :{
                    printf("Enter the coordinates : \n");
                    scanf_s("%d",&coor);
                    //printf("%c",x);
                    //printf("%d",coor);
                    //strcpy_s(&l1[coor],1,"x");
                    l1[coor]=x;
                    break;
                }
                case 2 :{
                    printf("Enter the coordinates : \n");
                    scanf_s("%d",&coor);
                    l2[coor]=x;
                    break;
                }
                case 3 :{
                    printf("Enter the coordinates : \n");
                    scanf_s("%d",&coor);
                    l2[coor]=x;
                    break;
                }
        next=2;
        }
        for(int i=0;i<=2;i++){
            printf("[%s]",&l1[i]);
        }
        printf("\n");
        for(int i=0;i<=2;i++){
            printf("[%s]",&l2[i]);
        }
        printf("\n");
        for(int i=0;i<=2;i++){
            printf("[%s]",&l3[i]);
        }
        printf("\n");
        case 2 :{
            printf("To select the line enter 1,2 or 3 : \n");
            scanf_s("%d",&lineInt);
            switch (lineInt){
                case 1 :{
                    printf("Enter the coordinates : \n");
                    scanf_s("%d",&coor);
                    l1[coor]=o;
                    break;
                }
                case 2 :{
                    printf("Enter the coordinates : \n");
                    scanf_s("%d",&coor);
                    l2[coor]=o;
                    break;
                }
                case 3 :{
                    printf("Enter the coordinates : \n");
                    scanf_s("%d",&coor);
                    l2[coor]=o;
                    break;
                }
        next=2;
        }
    }
}
n++;
}
}

}

于 2012-11-07T11:14:39.580 に答える