小编m13*_*13r的帖子

执行strtol后的错误处理

我想读几个数字stdin,每行一个数字.我想忽略任何行上的数字和字符串之后的任何尾随文本.为了实现这一点,我使用了以下代码:

while (getline(cin, str)) {
    num = strtol(str.c_str(), NULL, 0);

    if (errno != ERANGE && errno != EINVAL) {
        arr[i++] = num;
        req_pages_size++;
        cout << arr[i-1] << "\t";
    }

    str.clear();
}
Run Code Online (Sandbox Code Playgroud)

ISSUE:转换失败后,errno无法更新成功转换案例的错误值.对于之前未成功的通话,它的价值保持不变.

请让我知道如何处理这个问题?

error-handling errno strtol

3
推荐指数
1
解决办法
1473
查看次数

打印所有环境变量但跳过多行变量

我想打印除某些变量之外的所有环境变量。

因此我在stackoverflow上找到了一个解决方案:Bash: Loop through Variables contains pattern in name

while IFS='=' read -r name value; do
    if [ ! "$name" = "SOMEVAR" -a ! "$name" = "SOMEOTHERVAR" ]; then
        echo "$name=$value"
    fi
done < <(env)
Run Code Online (Sandbox Code Playgroud)

但是,如果我的环境变量包含换行符,则这不起作用,例如:

export SOMEVAR="some
text with
newlines"
Run Code Online (Sandbox Code Playgroud)

使用上述解决方案,它将打印:

text with=
newlines=
PWD=/home/...
...
Run Code Online (Sandbox Code Playgroud)

我还尝试使用以空结尾的字符串和多行匹配sed

env -0 | sed -e '{N; s@SOMEVAR.*\x0@@ ; D}' | tr '\0' '\n'
Run Code Online (Sandbox Code Playgroud)

但这会切断输出,并且总是首先打印具有多行内容的变量的最后一行:

newlines
PWD=/home/...
...
Run Code Online (Sandbox Code Playgroud)

有没有办法在打印时跳过多行环境变量?

unix bash loops environment-variables multiline

3
推荐指数
1
解决办法
973
查看次数

计算成本

是否有人知道这两段代码的计算成本是多少?

while (n > 2)
   n = sqrt(n);

while (n > 2)
   n = log(n);
Run Code Online (Sandbox Code Playgroud)

c c++ algorithm

2
推荐指数
1
解决办法
538
查看次数

使用getchar()捕获HOME键

我正在为Linux上的控制台程序编写命令行界面.我希望能够使用像箭头一样的键.所以为了捕获代码,我使用这个简单的程序:

int main()
{
    int c = 0;
    while (c != 3) { // ctrl-c
        c = getchar();
        printf("%d\n", c);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做我在捕获HOME键时遇到了问题.在一台计算机上我得到了序列"27 91 72",在另一台计算机上我得到了"27 79 72",在第三台我得到了"27 91 49 126".

我不知道为什么我在HOME和END键上得到如此不同的代码(箭头和F1-F12键在三台计算机上给出了相同的序列).

有没有一种标准的方法来获取这些键,或者某种配置可以在所有机器上提供相同的序列?

linux keyboard terminal getchar

2
推荐指数
1
解决办法
1397
查看次数