C++:有趣的字符串比较崩溃

标签 c++ strcmp strncmp

我正在尝试在 C++ 程序中使用一个简单的命令行参数来触发不同的程序行为——当你包含一个“y”(或任何以 y 开头的字符串——我真的不在乎)时,程序会显示一些中间结果。
当我运行时

ccal pix.txt

一切正常。

当我使用

ccal pix.txt yes

它运行正常,显示我的像素并在最后崩溃。

此外,

ccal pix.txt no

在不显示 pix 的情况下运行一切正常(就像它应该的那样),但在最后仍然崩溃。

这是相关代码 - 我做错了什么?

void dumpFloatMatrix(Mat m){
for(int i = 0; i < m.cols; i++){
    for(int j = 0; j < m.rows; j++){
        char *buff = new char[10];
        sprintf(buff, "%5.1f ", m.at<float>(i,j));
        cout << buff;
        delete buff;
    }
    cout << endl;
}
 }
int main(int argc, char *argv[]){
char* outFile;
bool showPix = false;

// Take in command line args
switch(argc){
case 3:
    if(strncmp(argv[2], "y", 1) == 0)
        showPix = true;
    outFile = argv[1];
    break;
case 2:
    outFile = argv[1];
    break;
default:
    cout << "Usage: ccal INPUT_LIST_FILE" << endl;
    return -1;
}
Mat cameraMatrix(3, 3, CV_32FC1);
dumpFloatMatrix(cameraMatrix);
return 0;
}

奇怪的是,即使我将案例 3 中的测试切换为如下内容:

        if(argv[2][0] == 'y')

我仍然得到相同的行为。我这辈子都想不通为什么。

最佳答案

抱歉,这纯粹是疯了:

for(int j = 0; j < m.rows; j++){
    char *buff = new char[10];
    sprintf(buff, "%5.1f ", m.at<float>(i,j));
    cout << buff;
    delete buff;
}

为 10 字节的数组调用 new/delete 将花费 16-32 字节的内存加上您想要的十个字节 [可能四舍五入为 16、32 或 64 字节]。以及分别调用new和delete。是的,我确定cout << buff将需要更多的周期,但在某种程度上是必要的。

要么使用:

for(int j = 0; j < m.rows; j++){
    char buff[10];
    sprintf(buff, "%5.1f ", m.at<float>(i,j));
    cout << buff;
}

或者使用C++风格的格式化:

for(int j = 0; j < m.rows; j++){
    cout << precision(1) << setw(5) << m.at<float>(i,j);
}

如果数组非常大,您可能更愿意将它们移出循环:

cout.precision(1); 
cout.setw(5);

我更喜欢最后一种方法 - 因为如果您的计算结果为 1210121281.9,它不会溢出 [您的布局看起来有点滑稽]。

关于C++:有趣的字符串比较崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297567/

相关文章:

c++ - 使程序停止直到按下回车

c - 缓冲区上的基名进入段错误

c++ - c/c++当size为0时strncmp的返回值是多少

c - 我们将 -1 作为 strncmp() 中第三个参数的值传递,会发生什么。 n 要比较的字节数?

c - "series"中的 strcmp()

c - 链表中的 strncmp

c++ - 使用两个线程运行和中断无限循环

c++ - 编译器会折叠结构相同的类吗?

c++ - 如何在退出时调试 CorExitProcess 中的访问冲突 0xC0000005?

c - strcmp 不比较