Так что я пытаюсь сам изучить C++, и я не могу понять эту определенную ошибку в своей программе. Вот что я до сих пор. В любом случае, все это работает отлично; У меня есть пользователь, который вводит свою переменную через мои подсказки, которые я настраивал, но для меня сложно определить, какое целое они используют. Как вы можете видеть, я собрал несколько условных выражений, сравнивающих размеры байтов и max/min для каждого из int type (подписанный, неподписанный, длинный, короткий), но всякий раз, когда я запускаю программу, даже если я не использую целое число или какое-то число bizzare, которое должно легко отображаться как долгое, мое возвращение всегда является проклятым подписанный int. Может ли кто-нибудь предложить мне немного советов о том, какие следующие шаги я должен предпринять? Я также не могу вызвать сообщение об ошибке, которое должно отображаться, когда номер не вводится в командную строку. Думая теперь исправить это, все, что мне нужно сделать, это бросить список массивов запрещенных символов/букв, которые вызовут ошибку, не так ли?Идентификация базовой переменной C++
/*********************************************************************
** Program Filename: int.cpp
** Description: Checks int type and prints various other details
** Input: int
** Output: metadata
*********************************************************************/
#include <iostream>
#include <climits> // redundant, included in iostream
#include <typeinfo>
#include <string>
#include <sstream>
#include <limits>
#include <stdint.h>
#include <cstdio>
using namespace std;
/* define global variables */
int myNumber;
string dataType= "";
/*********************************************************************
** Function: Prompt
** Description: Prompts user for value
** Return: Void
*********************************************************************/
void prompt()
{
/* define local variables*/
string input = "";
/* ask for value until valid value is entered, else show error message */
while (true) {
/* Pronmpt user */
cout << "Please enter an integer: ";
/* get user input */
getline(cin, input);
/* add user input value to string buffer */
stringstream streamNum(input);
/* check to see if user entered a valid value */
if (streamNum >> myNumber)
cout << endl;
break;
/* error message if not int */
cout << "ERROR: Invalid integer, please try again" << endl;
}
}
/*********************************************************************
** Function: Get int type
** Description: conditionals to assign data type. using online docs for bit length
** Return: Void
*********************************************************************/
void typeID()
{
if (sizeof(myNumber) == 4)
{
dataType = "signed";
} else if (sizeof(myNumber) == 4 && myNumber >= 0)
{
dataType = "unsigned";
} else if (sizeof(myNumber) == 4 && myNumber >> -2147483647 && myNumber << 2147483647)
{
dataType = "long";
}else if (sizeof(myNumber) == 2 && myNumber >> -32768 && myNumber << 32767)
{
dataType = "short";
}else
cout << "You did not enter a valid integer. Try again soon! "<< numeric_limits<int>::min();
}
/*********************************************************************
** Function: limits
** Description: check max and min of various int types
** Return: Void
*********************************************************************/
void limits()
{
if (dataType == "signed")
{
cout << "Maximum Signed Int Value: " << INT_MAX << endl;
cout << "Minimum Signed Int Value: " << INT_MIN << endl;
}else if (dataType == "unsigned")
{
cout << "Maximum Unsigned Int Value: " << UINT_MAX << endl;
cout << "Minimum Unsigned Int Value: " << 0 << endl;
} else if (dataType == "long")
{
cout << "Maximum Long Int Value: " << LONG_MIN << endl;
cout << "Minimum Long Int Value: " << LONG_MAX << endl;
}else if (dataType == "short")
{
cout << "Maximum Short Int Value: " << SHRT_MAX << endl;
cout << "Minimum Short Int Value: " << SHRT_MIN << endl;
}
}
/*********************************************************************
** Function: int info
** Description: prints info of user variable
** Return: Void
*********************************************************************/
void info()
{
/* print details */
cout << "You entered: " << myNumber << endl;
cout << "Integer type: " << dataType << endl; /* demangles and prints type operator of user entered int */
}
/*********************************************************************
** Function: main function
** Description: runs program
*********************************************************************/
int main()
{
prompt();
typeID();
info();
limits();
return 0;
}
вы объявили 'myNumber' как' int', поэтому он является подписанным int everytime. Вам действительно нужно объявить переменную как «short myNumber» или «unsigned myNumber», если вы хотите ее изменить. Строковый поток только собирается взять номер, который они ввели, и попытаться поместить его в POD, который вы передали. – RyanP
'sizeof (x)' не зависит от значения 'x'. (И ваша логика совершенно нелогична. И вы ошибаетесь «<' and '>».) – molbdnilo
@RyanP переменная myNumber должна оставаться как int, но это то, что вы говорите мне, что когда объявлено как int, int и пользователь не может ввести длинный int, например? Это статично? Поскольку я считаю, что я должен писать функцию, которая вводит пользовательский ввод и объявляет ее длинной короткой подпиской или неподписанной на основе того, как мы к ней подходим. –