1

何が問題なのかまったくわかりません。ループを 1 回繰り返した直後に終了する while ループ (コード ブロック 1) があります。switch ステートメント全体をコメントアウトしたので、printf(...)andだけがscanf(...)残り、ループが終了したように見えます。

ループ:

int main(int argc, char *argv[]) {
if(argc != 2) {
    printf("Usage requires hostname\n");
    return 1;
}

TCPClient client;
char str[1];
unsigned char buf[BUFLEN];
bool run = true;

printf("The commands in use are:\n"
    "h - help\n"
    "r - read ENCs (incremental)\n"
    "x - exit\n");

while(run) {
    printf("Enter a command: ");
    scanf("%s", str);

    switch(str[0]) {
      case 'h':
        printf("The commands in use are:\n"
            "h - help\n"
            "r - read ENCs (incremental)\n"
            "x - exit\n");
        break;

      case 'r':
        client.recvData(argv[1], buf, BUFLEN);

        for(int i = 0; i < BUFLEN / 4; i++) {
            if(i % 3 == 0)
                printf("\n");

            printf("Encoder %d: %d\t", i, (int)((((buf[4 * i] << 24) | (buf[4 * i + 1] << 16)) | (buf[4 * i + 2] << 8)) | (buf[4 * i + 3])));
        }
        printf("\n");
        break;

      case 'x':
        run = false;
        break;

      default:
        printf("Unrecognized command\n");
        break;
    }
}

return 0;
}

ある時点で、私は追加しました

if(run)
    printf("run = true");

while ループの後、コントロール bool ( run) が false であるためにループが壊れているかどうかを確認します。結果は何も出力されませんでした。これは、どういうわけかrunfalse になったことを示しています。これは、入力が何であれ、または switch ステートメントがなくなった場合でも発生します。この場合、何もrunfalse になるべきではありません。

本当に奇妙なのは、別のファイルに、実際に機能することを除いて、同様のループがあることです。

void *control(void *arg) {
DAC dac(5);
char str[1];
int chan = -1;
uint16_t code = -1;

while(run) {
    printf("Enter a command: ");
    scanf("%s", str);

    switch(str[0]) {
      case 'h':
        printf("The commands in use are:\n"
            "h - help\n"
            "s - set DACs\n"
            "r - read ENCs (incremental)\n"
            "t - read ENCs (cumulative)\n"
            "q - Toggle the quadrature waveform\n"
            "x - exit\n");
        break;

      case 's':
        chan = code = -1;

        printf("Enter the DAC channel: ");
        scanf("%d", &chan);

        printf("Enter the value: ");
        scanf("%hu", &code);

        pthread_mutex_lock(&lock);
        dac.setDAC(chan, code);
        pthread_mutex_unlock(&lock);
        break;

      case 'r':
        pthread_mutex_lock(&lock);
        for(int i = 0; i < BUFLEN; i++) {
            if(i % 3 == 0)
                printf("\n");
            printf("Encoder %d: %d\t", i, incBuf[i]);
            incBuf[i] = 0;
        }
        printf("\n");

        pthread_mutex_unlock(&lock);
        break;

      case 't':
        pthread_mutex_lock(&lock);
        for(int i = 0; i < BUFLEN; i++) {
            if(i % 3 == 0)
                printf("\n");
            printf("Encoder %d: %ld\t", i, cumBuf[i]);
        }
        printf("\n");

        pthread_mutex_unlock(&lock);
        break;

      case 'q':
        runSignal = !runSignal;
        if(runSignal)
            printf("Quadrature waveform enabled\n");
        else
            printf("Quadrature waveform disabled\n");

        break;

      case 'x':
        run = false;
        break;

      default:
        printf("Unrecognized command\n");
        break;
    }
}

dac.reset();
pthread_exit(NULL);
}

私は何が起こっているのかかなり迷っています...

4

2 に答える 2

3

in while-loopは、 isscanf("%s", str);の宣言が1 文字しか格納できないため (サイズが 1 であるため) 間違っています。ただし 、少なくとも 2 文字 (を含む) を格納します。最初と2番目の2つの文字で構成されているため、そのストアのみを入力すると、バッファオーバーフローが発生するとします-C標準によると未定義の動作です。str[]char str[1];scanf()\0c"c"c\0

于 2013-07-30T06:43:34.147 に答える
1

これはおそらく、scanf 中に str が run にオーバーフローするスタック バッファ オーバーフローです。これを確認するには、scanf をコメントアウトします。

于 2013-07-30T06:44:46.010 に答える