나는 단순히 무엇이 잘못되고 있는지 전혀 모른다. 루프를 한 번 반복 한 직후에 종료되는 while 루프 (코드 블록 1)가 있습니다. 나는 전체 switch 문을 주석 처리하여 printf(...)
및 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
)이 거짓 이기 때문에 중단되었는지 확인합니다 . 결과는 출력이 없었으며, 이는 어떻게 든 run
거짓이 되었음을 나타냅니다 . 이것은 입력이 무엇이든 상관없이 또는 switch 문이 없어도 발생합니다.이 경우 아무것도 run
거짓이 되어서는 안됩니다 .
정말 이상한 것은 다른 파일에서 실제로 작동하는 것을 제외하고는 비슷한 루프가 있다는 것입니다.
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);
}
나는 무슨 일이 일어나고 있는지 꽤 길을 잃었다 ...
동안 루프에서 scanf("%s", str);
의 선언이 있기 때문에 잘못 str[]
이다 char str[1];
(크기가 하나 같이)는 하나의 문자를 저장할 수 있습니다. 그러나 scanf()
최소 2 자 ( \0
)를 저장합니다. 두 개의 문자로 구성되어 c
있기 때문에 상점 만 입력한다고 가정 하고 두 번째는 버퍼 오버플로를 유발합니다 .C 표준에 따라 정의되지 않은 동작입니다."c"
c
\0
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다