试图忽略所有空格直到第一个字符(迫切需要一个简单的轻推)

joe*_*_04 5 c++

我会诚实地说,这是我完成作业所需的一小段代码.我知道社区对帮助学生非常怀疑,但在过去的5个小时里我一直在靠近墙壁,并且在这项任务中没有任何成就.我从来没有在任何任务上寻求帮助,但没有人给我这么多麻烦.

所有我遇到的麻烦都是让程序剥离出领先的空白区域.我想我可以处理剩下的事了.我不是要求我的整体任务的解决方案,只是在这一个特定部分的推动.

我会在这里发布完整的作业文本,但我不是发布它以试图获得完整的解决方案,我只发布它以便其他人可以看到我必须使用的条件.

"这个功课将为你提供更多编写函数的练习,以及如何将数字读入变量.你需要编写一个函数,将无符号整数读入unsigned short int类型的变量.这个函数的最大值为65535 ,函数需要处理非法数字.你不能在函数内部使用"cin >>".数字输入的规则基本如下:

1)跳过所有前导空格2)找到的第一个字符必须是数字否则将发生错误3)然后一次处理一个数字字符并与数字4结合处理非数字时发现处理停止

我们将遵循这些规则并添加错误处理和溢出.如果在数字之前进行非法输入而不是错误代码"1"将被发回,如果发生溢出,这个数字大于65535,则将发回错误代码"2".如果没有错误,则返回"0".

确保main函数将继续循环,直到用户输入"n"或"N"为NO,main应该测试从"ReadInt"函数返回的错误代码并显示相应的错误消息或显示数字没有错误.注意设计"ReadInt"函数,它应该是值返回并具有引用参数.该函数需要从输入缓冲区一次处理一个字符并以正确的方式处理它.读入数字后,请确保输入缓冲区为空,否则main中的循环可能无法正常工作.我知道这不是提取的工作方式,但让我们这样做.

您不需要使用此分配输入算法,但我建议您编写一个.调试器也可能有用.你基本上重写了提取运算符,因为它适用于整数."

我的大多数代码都没有意义,因为我一直在删除东西并添加疯狂的东西来尝试我能想到的一切.

#include <iostream>
#include <CTYPE.h>

using namespace std;

int ReadInt (unsigned short int &UserIn);

int main()
{
    int Error;
    unsigned short int UserInput;
    char RepeatProgram;

    do
    {
        Error=ReadInt(UserInput);

        if (Error==0)
            cout << "Number is " << UserInput << endl;

        else if (Error==1)
            cout << "Illegal Data Entry\n";

        else if (Error==2)
            cout << "Numerical overflow, number too big\n";

        cout << "Continue?  n/N to quit: ";
        cin >> RepeatProgram;

        cout << endl;

    } while (RepeatProgram!='N' && RepeatProgram!='n');

}

int ReadInt (unsigned short int &UserIn)
{
    int Err=0;
    char TemporaryStorage;
    long int FinalNumber=0;

    cout << "Enter a number: ";

    //cin.ignore(1000, !' '); this didn't work

    cin.get(TemporaryStorage);

    cout << TemporaryStorage;//I'm only displaying this while I test my ideas to see if they are working or not, before I move onto the the next step

    cout << endl;

    return Err;
}
Run Code Online (Sandbox Code Playgroud)

我真的很感激我可能得到的任何帮助,并希望我不会给人的印象是我正在寻找一个完整的免费解决方案来解决整个问题.我想自己做这件事,我在这个开头就是很多.

344*_*442 5

作为序言,我想说这是一个学生提出的问题,但与大多数类型的问题不同,这是一个质量问题,值得提供高质量的答案,所以我会尝试这样做;).我不会尝试回答您的具体问题,也会向您展示代码中的其他轻微问题.

首先,让我们一步一步地分析您的代码.或多或少像调试器一样.花点时间仔细阅读;)...

#include <iostream>
#include <CTYPE.h>
Run Code Online (Sandbox Code Playgroud)

包括标题<iostream><ctype.h>(由于Windows中的NTFS的一些缺陷/设计决策,大写的工作).我建议你改用第二行#include <cctype>.

using namespace std;
Run Code Online (Sandbox Code Playgroud)

这对任何初学者/学生都没问题,但是没有养成习惯!出于"纯度"的目的,我会明确地使用std::这个答案,好像这条线不存在一样.

int ReadInt (unsigned short int &UserIn);
Run Code Online (Sandbox Code Playgroud)

声明一个函数ReadInt,该函数接受UserIn类型的引用unsigned short int并返回一个类型的对象int.

int main()
{
Run Code Online (Sandbox Code Playgroud)

特殊功能main; 没有参数,返回int.开始功能.

    int Error;
    unsigned short int UserInput;
    char RepeatProgram;
Run Code Online (Sandbox Code Playgroud)

声明变量Error,UserInput以及RepeatProgram与各自的类型int,unsigned short intchar.

    do
    {
Run Code Online (Sandbox Code Playgroud)

Do-while块.开始.

        Error=ReadInt(UserInput);
Run Code Online (Sandbox Code Playgroud)

指定的返回值ReadInt类型int调用参数UserInput类型的int&变量Error类型unsigned short int.

        if (Error==0)
            std::cout << "Number is " << UserInput << endl;
Run Code Online (Sandbox Code Playgroud)

如果Error为零,则打印UserInput到标准输出.

        else if (Error==1)
            std::cout << "Illegal Data Entry\n";

        else if (Error==2)
            std::cout << "Numerical overflow, number too big\n";
Run Code Online (Sandbox Code Playgroud)

否则,如果发生错误,请通过以下方式将其报告给用户std::cout.

        std::cout << "Continue?  n/N to quit: ";
        std::cin >> RepeatProgram;
Run Code Online (Sandbox Code Playgroud)

查询用户是否要继续或退出.将输入字符存储在RepeatProgram类型中char.

        std::cout << std::endl;
Run Code Online (Sandbox Code Playgroud)

冗余,除非你想添加填充,这可能是你的目的.实际上,你做得更好std::cout << '\n',但这并不重要.

    } while (RepeatProgram!='N' && RepeatProgram!='n');
Run Code Online (Sandbox Code Playgroud)

匹配上面的do-while块的表达式.如果RepeatProgram既不是低位字母也不是大写字母,则重复执行给定的块N.

}
Run Code Online (Sandbox Code Playgroud)

结束功能main.隐含返回值为零.

int ReadInt (unsigned short int &UserIn)
{
Run Code Online (Sandbox Code Playgroud)

函数ReadInt需要一个参考UserInunsigned short int,并返回类型的对象int.开始功能.

    int Err=0;
    char TemporaryStorage;
    long int FinalNumber=0;
Run Code Online (Sandbox Code Playgroud)

声明变量Err,TemporaryStorage以及FinalNumber各类型的int,charlong int.变量ErrFinalNumber分别初始化为00.但是,只是一件事.没有分配表示输出数量存储在一个unsigned short int?所以,更好的...

    unsigned short int FinalNumber = 0;
Run Code Online (Sandbox Code Playgroud)

现在...

    std::cout << "Enter a number: ";

    //std::cin.ignore(1000, !' '); this didn't work
Run Code Online (Sandbox Code Playgroud)

嗯?这应该是什么?(错误:中止调试器,因为这没有逻辑!**).我期待你//在评论之前忘记了,对吧?现在,你期望!' '评价除了'\0'什么?istream::ignore(n, ch)将丢弃输入流中的字符,直到n丢弃任何字符,ch找到字符或到达文件结尾.

更好的方法是......

   do
       std::cin.get(TemporaryStorage);
   while(std::isspace(TemporyStorage));
Run Code Online (Sandbox Code Playgroud)

现在...

    std::cin.get(TemporaryStorage);
Run Code Online (Sandbox Code Playgroud)

使用上述方法可以丢弃该行;).

对.现在,进入你明显撞击人类已知的所有固体物体的部分.让我帮你一点.我们有这种情况.使用上面的代码,TemporaryStorage将保留do-while循环后不是空格的第一个字符.所以,我们还剩下三件事.首先,检查输入中是否至少有一个数字,否则返回错误.现在,虽然输入由数字组成,但将字符转换为整数,然后相乘然后加上以获得实际的整数.最后,这是最......唉......奇怪的是,我们需要避免任何溢出.

    if (!std::isdigit(TemporaryStorage)) {
        Err = 1;
        return Err;
    }

    while (std::isdigit(TemporaryStorage)) {
        unsigned short int OverflowChecker = FinalNumber;

        FinalNumber *= 10; // Make slot for another digit
        FinalNumber += TemporaryStorage - '0'; '0' - '0' = 0, '1' - '0' = 1...

        // If an unsigned overflows, it'll "wrap-around" to zero. We exploit that to detect any possible overflow
        if (FinalNumber > 65535 || OverflowChecker > FinalNumber) {
            Err = 2;
            return Err;
        }

        std::cin.get(TemporaryStorage);
    }

    // We've got the number, yay!
    UserIn = FinalNumber;
Run Code Online (Sandbox Code Playgroud)

代码不言自明.如果您对此有任何疑问,请发表评论.

    std::cout << TemporaryStorage;//I'm only displaying this while I test my ideas to see if they are working or not, before I move onto the the next step

    cout << endl;

    return Err;
Run Code Online (Sandbox Code Playgroud)

我应该在这说些什么吗?无论如何,我已经做到了.只要记住std::cout在展示你的作品之前把它拿出去;).

}
Run Code Online (Sandbox Code Playgroud)

结束功能ReadInt.