Съжалявам, ако дублирам, но опитах ВСИЧКО и не мога да разбера защо този код продължава да се поврежда. Целта с най-висок приоритет беше този код да обработва безопасно въвеждането или просто всичко, което потребителят може да въведе в конзолата, без да се счупи. Но също така ми трябва, за да мога да стартирам повече от веднъж. 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