【问题标题】:How do I accept two 2d matrix and multiply print the answer in proper format?如何接受两个二维矩阵并以正确的格式乘以打印答案?
【发布时间】:2022-01-06 15:01:04
【问题描述】:

我编写了一个程序来接受和打印,但在接受二维数组时出错。

错误:- 线程“主”在“Err 值上调用 Result::unwrap() 时惊慌失措:ParseIntError { kind: InvalidDigit }”,test1.rs:15:39 注意:使用RUST_BACKTRACE=1 环境变量运行以显示回溯

use std::io;

fn main() {
    let width = 3;
    let height = 3;

    let mut array = vec![vec![0; width]; height];
    let mut input_text = String::new();
    for i in 0..width {
        for j in 0..height {
            io::stdin()
                .read_line(&mut input_text)
                .expect("failed to read from stdin");
            let trimmed = input_text.trim();
            let t:u32=trimmed.parse().unwrap(); //error
            array[i][j]=t;
            println!("{:?}", array);
        }
    }

    println!("{:?}", array);
}

输出:- 1

[[1, 0, 0], [0, 0, 0], [0, 0, 0]]

2

线程'main'在'调用Result::unwrap()Err值时恐慌:ParseIntError {种类:InvalidDigit}',test1.rs:15:39 注意:使用RUST_BACKTRACE=1 环境变量运行以显示回溯

【问题讨论】:

  • 请花时间提供正确的minimal reproducible example。对于像“遇到一些错误”这样的问题陈述,不清楚究竟是什么问题。如果编译失败,请将编译器的完整错误消息 verbatim 发布到问题中。如果在执行过程中出现错误,请发布提供的输入和相应的错误输出。
  • 如果没有适当的 MRE,很难回答,但如果我不得不猜测,我会说您在内部循环中错过了对 input_text.clear() 的调用。
  • 请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example。

标签: arrays multidimensional-array rust 3d rust-tokio


【解决方案1】:

您的代码距离工作仅一行 :)。

您可能会注意到程序失败的总是第二个条目。这是因为,那个时候,字符串input_text包含了之前的输入(数字+换行符)。

如果您检查documentation 的std::io::stdin().read_line():

锁定此句柄并读取一行输入,将其追加到指定的缓冲区。

由于这种行为,您提供的新输入值将附加到input_text,而不是替换其内容。输入1再输入2后,input_text包含"1\n2",显然无法正确解析,因此抛出了Err()。

因此,让您的代码正常工作的最简单解决方案是在每次插入后将 input_text 重置为空字符串。

【讨论】:

    【解决方案2】:
    use std::io;
    
    fn main(){
    
    let width = 3;
    let height = 3;
    
    let mut array1 = vec![vec![0; width]; height];
    println!("Enter values for 1st matrix");
    for i in 0..width {
        for j in 0..height {
            let mut input_text = String::new();
            io::stdin()
                .read_line(&mut input_text)
                .expect("failed to read from stdin");
            let trimmed = input_text.trim();
            let t:u32=trimmed.parse().unwrap();
            array1[i][j]=t;
            println!("{:?}", array1);
        }
    }
    
    let mut _array2 = vec![vec![0; width]; height];
    println!("Enter values for 2st matrix");
    for a in 0..width {
        for b in 0..height {
            let mut input_text1 = String::new();
            io::stdin()
                .read_line(&mut input_text1)
                .expect("failed to read from stdin");
            let trimmed1 = input_text1.trim();
            let t1:u32=trimmed1.parse().unwrap();
            _array2[a][b]=t1;
            println!("{:?}",_array2);
        }
    }
    
    //mult
    let mut multmat = vec![vec![0; width]; height];
    //println!("Enter values for 2st matrix");
    for a in 0..width {
        for b in 0..height {
            multmat[a][b]=0;
            for k in 0..height{
                multmat[a][b]=multmat[a][b]+array1[a][k]*_array2[k][b];
            }
        }
    }
    
    for a in 0..width {
        for b in 0..height {
            print!("{} ",multmat[a][b]);
        }
        println!("\n");
    }
    
    
    //println!("{:?}", array1);
    //println!("{:?}", _array2);
    //println!("{:?}", multmat)
    

    }

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
    猜你喜欢
    • 2012-10-01
    • 2011-07-01
    • 2020-06-12
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    相关资源
    最近更新 更多