我正在嘗試制作一個字串反向程式。我正在嘗試修復溢位/下溢的錯誤。我修復了第一個,所以現在我設定 MAX = 8 只是為了更容易除錯。它作業正常。但是當我的輸入比 MAX 短時,程式就會崩潰。

因此,如您所見,字串“QWERTY ASDFGH”被正確剪切,我有“QWERTY A”(正好是 8 個字符),然后程式將其反轉,輸出為“A YTREWQ”。它正是我想要的。
但是如果實際長度小于 8,我按回車鍵,什么也沒有發生。我必須按兩次它仍然有這個損壞的輸入和輸出。輸出轉到一個新行,但這不是它必須如何作業。
這是我的源代碼:
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#define MAX 8 // not including '\0' symbol
void printAsterisks(uint8_t);
void clearInputBuffer(void);
int main(void) {
char word[MAX 1], temp;
int length, index;
printAsterisks(46);
printf("Please, type in any string. To exit give me #.\n");
printAsterisks(46);
while(1) {
index = 0;
printf("Your string : ");
fgets(word, MAX 1, stdin);
if(word[0] == '#') {
printAsterisks(39);
printf("The program has been cancelled by User.\n");
printAsterisks(39);
break;
}
clearInputBuffer();
length = strlen(word);
for(index = 0; index < length / 2; index ) {
temp = word[index];
word[index] = word[length - index - 1];
word[length - index - 1] = temp;
}
printf("Reversed : %s\n", word);
}
return 0;
}
void printAsterisks(uint8_t count) {
for(uint8_t i = 0; i < count; i ) {
printf("*");
}
printf("\n");
}
void clearInputBuffer(void) {
static char buff;
while((buff = getchar()) != '\n' && buff != EOF);
}
uj5u.com熱心網友回復:
問題是您嘗試重繪 輸入緩沖區。
該fgets呼叫讀取,并包括在緩沖區中的換行符,如果它符合。
當您輸入少于MAX字符時,fgets呼叫將讀取換行符,但您仍然呼叫clearInputBufferwhich 將嘗試讀取直到下一個換行符。
您需要檢查緩沖區是否word包含換行符,并且僅clearInputBuffer在其中沒有換行符時才呼叫。
您可以使用該strcspn函式來檢查換行符,以及使用其回傳的位置來設定空終止符以從緩沖區中“洗掉”換行符:
size_t newline_pos = strcspn(word, "\n");
if (word[newline_pos] == '\n')
{
// There's a newline in the input, remove it
word[newline_pos] = '\0';
}
else
{
// There's no newline, skip the remainder of the line
clearInputBuffer();
}
uj5u.com熱心網友回復:
正如@Some 程式員老兄所說,該clearInputBuffer函式無效,我對其進行了一些更改。我想你的意思是清除word. 我也做了word和temp全球性的,并呼吁clearInputBuffer之后,而不是決議字串和扭轉它。
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#define MAX 8 // not including '\0' symbol
char word[MAX 1], temp;
void printAsterisks(uint8_t);
void clearInputBuffer(void);
int main(void) {
int length, index;
printAsterisks(46);
printf("Please, type in any string. To exit give me #.\n");
printAsterisks(46);
while(1) {
index = 0;
fgets(word, MAX 1, stdin);
if(word[0] == '#') {
printAsterisks(39);
printf("The program has been cancelled by User.\n");
printAsterisks(39);
break;
}
length = strlen(word);
for(index = 0; index < length / 2; index ) {
temp = word[index];
word[index] = word[length - index - 1];
word[length - index - 1] = temp;
}
printf("Reversed : %s\n", word);
clearInputBuffer();
}
return 0;
}
void printAsterisks(uint8_t count) {
for(uint8_t i = 0; i < count; i ) {
printf("*");
}
printf("\n");
}
void clearInputBuffer() {
int i;
for (i = 0; word[i] != '\0'; i ) {
word[i] = '\0';
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368760.html
