小编Max*_*xpm的帖子

如何安全扫描整数输入?

Scanner scanner = new Scanner();
int number = 1;

do
{
    try
    {
        option = scanner.nextInt();
    }
    catch (InputMismatchException exception)
    {
        System.out.println("Integers only, please.");
    }
}
while (number != 0);
Run Code Online (Sandbox Code Playgroud)

尽管存在异常处理,但在给出非整数输入时,此代码将进入无限循环.它不是Scanner暂停在下一次迭代中收集输入,而是继续抛出InputMismatchExceptions直到程序被杀死.

扫描整数(或其他类型,我猜)输入,丢弃无效输入并正常继续循环的最佳方法是什么?

java exception input infinite-loop java.util.scanner

5
推荐指数
2
解决办法
2万
查看次数

为什么模数定义为编程语言中的模式

我不是在询问定义,而是为什么语言创建者选择在C++中定义具有不对称行为的模数.(我认为Java也是)

假设我想找到大于或等于n的最小数,它可以被f整除.

如果n是正数,那么我做:

if(n % f)
   ans = n + f - n % f;
Run Code Online (Sandbox Code Playgroud)

如果n为负数:

ans = n - n % f;
Run Code Online (Sandbox Code Playgroud)

显然,在处理负数和正数时,这个定义并不是最有利的.那为什么这样定义呢?在什么情况下会产生权宜之计?

language-agnostic math language-design modulus

5
推荐指数
1
解决办法
357
查看次数

有没有办法获得动态默认参数?

我正在尝试创建一个类,用户可以在其中修改成员变量以更改其成员函数的默认参数.

class Class
{
    public int Member;

    public void Method(int Argument = Member)
    {
        // This compiles fine, until I try to actually use
        // the method elsewhere in code!

        // "Error: need 'this' to access member Member"
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的解决方法是使用幻数,这显然不太理想.

public void Method(int Argument = 123)
{
    int RealArgument;

    if (Argument == 123) RealArgument = Member;
    else RealArgument = Argument;
}
Run Code Online (Sandbox Code Playgroud)

有更好的方法,还是我坚持使用这种"黑客"解决方案?

parameters d member-functions member-variables default-arguments

5
推荐指数
1
解决办法
117
查看次数

如何从sudo'd程序中执行作为原始用户的命令?

我必须用来sudo运行我的程序:

 sudo ./my_program
Run Code Online (Sandbox Code Playgroud)

我试图git clone从我的程序运行,但它尝试使用root用户的SSH密钥而不是我的.有没有办法以最初调用我的程序的用户身份执行此单个命令?

我想我能做到:

su - original_user -c "git --version"
Run Code Online (Sandbox Code Playgroud)

但是如何计算原始用户的用户名?还是有另一种优雅的解决方案吗?

c unix sudo

5
推荐指数
1
解决办法
136
查看次数

我应该默认使用三个相互排斥的 Clang 消毒剂中的哪一个?

Clang 有许多消毒剂,可以在运行时检查可疑行为。不幸的是,它们不能同时启用。

不能在同一程序中组合多个-fsanitize=address, -fsanitize=thread, 和-fsanitize=memory检查器。

更糟糕的是,这三个中的每一个似乎都非常有用,不能省略。AddressSanitizer 检查内存错误,ThreadSanitizer 检查竞争条件,MemorySanitizer 检查未初始化的读取。 我担心所有这些事情!

显然,如果我对虫子的位置有预感,我可以据此选择消毒剂。但如果我不这样做呢?更进一步,如果我想使用消毒剂作为预防工具而不是诊断工具来指出我什至不知道的错误怎么办?

换句话说,鉴于我没有特别寻找任何东西,默认情况下我应该使用哪种消毒剂进行编译? 我是不是只需要编译和测试整个程序三遍,每个消毒剂一次?

clang sanitizer clang++ address-sanitizer

5
推荐指数
1
解决办法
789
查看次数

无限循环和早期返回声明

我有一个简单的控制台应用程序,它输出一个菜单并等待用户输入.执行适当的操作后,整个过程重复进行.输入特定字符串时,程序退出.这是通过无限循环和早期返回语句实现的:

int main()
{
    while (true)
    {
        OutputMenu();

        string UserChoice;
        cin >> UserChoice;

        // ...

        if (UserChoice == "exit") return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据我的老师的说法,使用无限循环并使用return语句破解我的方法是不好的做法.他建议如下:

int main()
{
    bool ShouldExit = false;
    while (!ShouldExit)
    {
        OutputMenu();

        string UserChoice;
        cin >> UserChoice;

        // ...

        if (UserChoice == "exit") ShouldExit = true;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 使用无限循环和早期返回语句真的是一个坏主意吗?
  • 如果是这样,是技术原因还是仅仅是不好的做法?

c++ infinite-loop

4
推荐指数
4
解决办法
4302
查看次数

重载运算符[]

假设我有一个包含MyContainerClass整数的容器类.该[]运营商,如你所知,也可以被重载以便如果容器是一个规则的阵列,用户可以更直观地访问值.例如:

MyContainerClass MyInstance;
// ...
int ValueAtIndex = MyInstance[3]; // Gets the value at the index of 3.
Run Code Online (Sandbox Code Playgroud)

显而易见的返回类型operator[]int,但是用户将无法执行以下操作:

MyContainerClass MyInstance;
MyInstance[3] = 5;
Run Code Online (Sandbox Code Playgroud)

那么,返回类型应该operator[]是什么?

c++ operator-overloading return-type

4
推荐指数
2
解决办法
390
查看次数

C++图形库的内部工作原理

您可能知道,C++没有标准的图形库.大多数游戏都使用DirectX或OpenGL.

但这些图书馆实际上如何运作?换句话说,如果第三方库在C++中没有机制,它如何绘制图形?他们只是用另一种语言写的吗?

c++ graphics

4
推荐指数
2
解决办法
2140
查看次数

std :: string容量大小

字符串的容量大小是否总是15的倍数?

例如:在所有情况下,容量为15

string s1 = "Hello";

string s2 = "Hi";

string s3 = "Hey";
Run Code Online (Sandbox Code Playgroud)

还是随机的?

c++ string size

4
推荐指数
1
解决办法
2201
查看次数

重载运算符<<

我正在制作一个使用的简单课程operator<<.它将存储两个并行的数据数组,每个数据类型具有不同(但已知)的数据类型.这个想法是最终的界面看起来像这样:

MyInstance << "First text" << 1 << "Second text" << 2 << "Third text" << 3;
Run Code Online (Sandbox Code Playgroud)

这将使数组看起来像这样:

StringArray: | "First text" | "Second text" | "Third text" |
IntArray:    | 1            | 2             | 3            |
Run Code Online (Sandbox Code Playgroud)

我可以处理检查输入的逻辑,以确保一切都匹配,但我对技术细节感到困惑operator<<.

我检查的教程说它将它重载为具有std::ostream&返回类型的友元函数,但我的类与流无关.我尝试使用void返回类型,但有编译错误.最终我最终返回了对该课程的引用,但我不确定为什么会这样.

到目前为止,这是我的代码:

class MyClass
{
public:

MyClass& operator<<(std::string StringData)
{
    std::cout << "In string operator<< with " << StringData << "." << std::endl;

    return *this; // Why am I returning a reference to the …
Run Code Online (Sandbox Code Playgroud)

c++ oop class operator-overloading stream

4
推荐指数
1
解决办法
285
查看次数