Извините, если дублирую, но я перепробовал ВСЕ и не могу понять, почему этот код продолжает ломаться. Наивысшей приоритетной целью было сделать так, чтобы этот код безопасно обрабатывал ввод или все, что пользователь может ввести в консоль, не ломая его. Однако мне также нужно, чтобы он мог запускаться более одного раза. fgets() не позволит мне сделать это, так как он продолжает где-то читать '\n' и не позволяет мне вводить ввод более одного раза, когда он достигает конца цикла do/while. Я пробовал fflushing stdin, пробовал scanf("%d *[^\n]");
и просто обычный scanf("%d *[^\n]");
, но ни один из них не работает, и, по сути, они ломают код! Я использовал этот веб-сайт, чтобы попытаться получить код "Безопасная обработка ввода". работать, но я не совсем понимаю, что они делают. Я пытался накрутить (орфографию?) как мог, но не уверен, правильно ли я это сделал. Я что-то пропустил? Не думал, что такая, казалось бы, простая проблема может доставить столько головной боли! >_‹
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
#define BUF_LEN 100
#define SPACE 32
#define SPCL_CHAR1F 33
#define SPCL_CHAR1L 47
#define SPCL_CHAR2F 58
#define SPCL_CHAR2L 64
#define SPCL_CHAR3F 91
#define SPCL_CHAR3L 96
#define NUMF 48
#define NUML 57
#define UC_CHARF 65
#define UC_CHARL 90
#define LC_CHARF 97
#define LC_CHARL 122
void main ()
{
char* buffer;
int SpcCounter=0, SpclCounter=0, NumCounter=0,LcCounter=0, UcCounter=0;
char line[BUF_LEN],response[4];
char*input="";
bool repeat=false;
do
{
for(int i=0;i<BUF_LEN;i++)
{
line[i]=NULL;
}
buffer=NULL;
printf("Enter your mess of characters.\n");
buffer=fgets(line,BUF_LEN,stdin);
//To handle going over the buffer limit: BROKEN
if(buffer!=NULL)
{
size_t last=strlen(line)-1;
if(line[last]=='\n')
line[last]='\0';
else
{
fscanf(stdin,"%c *[^\n]");
}
}
for(int i=0;i<BUF_LEN;i++)
{
char temp=buffer[i];
if(temp==SPACE||temp==255)
SpcCounter++;
else if((temp >= SPCL_CHAR1F && temp <= SPCL_CHAR1L)||/*Special characters*/
(temp >= SPCL_CHAR2F && temp <= SPCL_CHAR2L)||
(temp >= SPCL_CHAR3F && temp <= SPCL_CHAR3L))
SpclCounter++;
else if (temp >=NUMF && temp <= NUML)/*Numbers*/
NumCounter++;
else if (temp >= UC_CHARF && temp <= UC_CHARL)/*Uppercase letters*/
UcCounter++;
else if (temp >= LC_CHARF && temp <= LC_CHARL)/*Lowercase letters*/
LcCounter++;
}
printf("There were %i space%s, %i special character%s, %i number%s, and %i letter%s,\n"
"consisting of %i uppercase letter%s and %i lowercase.\n",
SpcCounter,(SpcCounter==1?"":"s"),SpclCounter,(SpclCounter==1?"":"s"), NumCounter,(NumCounter==1?"":"s"),UcCounter+LcCounter,
(UcCounter+LcCounter==1?"":"s"), UcCounter,(UcCounter==1?"":"s"), LcCounter);
printf("Would you like to do this again? (yes/no)");
input=fgets(response,4,stdin);
/*
ALL BROKEN
if(input!=NULL)
{
size_t last=strlen(response)-1;
if(response[last]=='\n')
response[last]='\0';
else
{
fscanf(stdin,"%*[^\n]");
fscanf(stdin,"%c");
}
}
*/
//To capitalize the letters
for(int i=0;i<4;i++)
{
char* temp=&response[i];
if (*temp >= LC_CHARF && *temp <= LC_CHARL)
*temp=toupper(*temp);//Capitalize it
}
//To set repeat: WORKS, BUT WEIRD
repeat=!strncmp(input,"YES",4);
}
while(repeat);
}
getchar()
сбрасывает что-либо из буфера, что на самом деле делаетfflush(stdin)
(это не в моем выложенном коде, но он у меня был после каждого запроса на ввод ), и как мне избавиться от того, что по какой-то причине ОСТАЕТСЯ В БУФЕРЕ, даже после того, как я его сбросил, очистил буферы и сделал всеscanf("%*[^\n]")
. - person Skello   schedule 07.01.2014