Shanraq.org Shanraq.org
Пәрмен жолынан оқу: жол, бос жауап және енгізудің аяқталуы
IT

Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 34-сабақ (барлығы 35)

Пәрмен жолынан оқу: жол, бос жауап және енгізудің аяқталуы

34-сабақ. Тапсырма атауын оқып, бос жолды, енгізудің аяқталуын және оқу қатесін ажырату.

Мәтін ИИ көмегімен аударылды.

Алдын ала: 4, 21–22, 25 және 31–33-сабақтар. Result түсініксіз болса, 32-сабақты қайталаңыз.

Таныс бейне және тірек сызба

Қабылдау орнында адам атау жазуы, жолды бос қалдыруы немесе қабылдау арнасын жабуы мүмкін. Бұлар үш бөлек жағдай. Стандартты енгізу — бағдарлама әдетте пәрмен жолынан алатын мәтін ағыны; мәтінді өзге бағдарлама да бере алады. Ағынның аяқталуы (EOF) бұдан кейін дерек келмейтінін білдіреді. Бос жолға Enter басу — енгізілген жол, ағынның аяқталуы емес. Ұқсатудың шегі: read_line көзге көрінетін әріпті емес, оқылған байт санын қайтарады және оқу қатесін де бере алады.

Бос Stringread_line(&mut ...)Ok(0) / Ok(сан) / Errtrim() → жауап. std::io::stdin() стандартты енгізуге қатынайды; std::io — Rust стандартты кітапханасындағы енгізу мен шығару құралдарының жолы, ал :: 28-сабақтағыдай жол бөліктерін жалғайды. String::new() бос мәтін жасайды. read_line(&mut line) енгізілген жолды соған қосады, сондықтан өзгермелі сілтеме керек. Нәтижесі Result<usize, std::io::Error>: Ok(0) — ағын бітті, оң санды Ok — қанша байт оқылды, Err — оқу сәтсіз. usize — жиым сабақтарынан таныс өлшем мен индекс түрі. trim() жолдың екі шетіндегі бос орындар мен жол соңын алып, &str береді; атау ортасындағы бос орын қалады. Одан кейін мәтін "" болса, атау бос.

Алғашқы жауапты оқимыз

organizer жобасының бұрынғы src/main.rs файлын сақтап, оны толық ауыстырыңыз. Cargo.toml бар бумада cargo run орындаңыз. Басқа файл мен тәуелділік өзгермейді. Шақырудан кейін Оқу деп жазып, Enter басыңыз: бағдарлама Тапсырма: Оқу көрсетеді. Пәрмен жолында өзіңіз терген таңбалар бөлек көрінуі мүмкін; олар println! нәтижесі емес.

Автоматты тексеруде мысалға алдын ала аяқталған бос ағын беріледі. Сондықтан төмендегі нәтиже EOF тармағын көрсетеді. Кәдімгі қолдануда атау теріп, өзге тармақты тексеріңіз.

fn main() {
    let mut line = String::new();
    println!("Атау енгізіңіз:");
    match std::io::stdin().read_line(&mut line) {
        Ok(0) => println!("Енгізу аяқталды"),
        Ok(_) => {
            let title = line.trim();
            if title == "" {
                println!("Атау бос");
            } else {
                println!("Тапсырма: {title}");
            }
        }
        Err(_) => println!("Енгізуді оқу мүмкін болмады"),
    }
}
Атау енгізіңіз:
Енгізу аяқталды

Мәтінсіз Enter басылса, Ok(_) тармағы таңдалады; trim() соңында атау бос болып, Атау бос шығады. Ағын біткенде Ok(0) болады. trim() атаудың басы мен соңындағы бос орынды да өшіреді; тапсырма атауына бұл қолайлы болуы мүмкін, бірақ өзге дерекке ережені бөлек таңдаңыз. Мұнда бір жол ғана оқылады; жоспарлау құралының толық пәрмендер айналымы кейін келеді.

Ағын соңы бос атау емес

Үш жағдайды жеке сынаңыз: Оқу атауы, бос жолға Enter басу, ағыннан мүлде дерек келмеуі. Ok(0) мен Ok(_) шатасса, дерек көзі жабылғанда да бағдарлама атау күтуі мүмкін. Err мәнін де үндемей бос тапсырмаға айналдырмаңыз. Пайдаланушы енгізуін оқу кезінде .unwrap() қолданбаңыз.

Түсінгеніңізді тексеріңіз

  1. Неге line үшін mut керек?
  2. Ok(0) бос жолға Enter басудан несімен өзгеше?
  3. trim() екі сөз арасындағы бос орынды өшіре ме?

Жауап: read_line мәтінді өзгертеді; Ok(0) — ағын соңы, Enter жол соңын оқытады; сөз арасындағы орын қалады. Тірек сызбаны жатқа айтыңыз.

Тапсырма

Міндетті. Стандартты енгізуден бір атау оқыңыз. EOF кезінде Басқа енгізу жоқ, trim() соңында бос болса Атау қажет, ал дұрыс атау берілсе Қосу: АТАУ шығарыңыз; атау енгізуден алынсын. Err болса, Оқу қатесі көрсетіңіз. Үш қалыпты жағдайды тексеріңіз; EOF үшін енгізу ағынын пәрмендік ортаңыздың тәсілімен аяқтаңыз немесе бос файлды беріңіз.

Шекара. Менің жоспарым деп жазып, екі сөз арасындағы бос орын сақталғанын көріңіз.

Ишара

match ішінде әуелі Ok(0), одан соң Ok(_), соңында Err(_) болсын. Ok(_) ішінде let title = line.trim(); жазып, бос мәтінмен салыстырыңыз.

Талпыныстан кейінгі үлгі жауап

fn main() {
    let mut line = String::new();
    match std::io::stdin().read_line(&mut line) {
        Ok(0) => println!("Басқа енгізу жоқ"),
        Ok(_) => {
            let title = line.trim();
            if title == "" {
                println!("Атау қажет");
            } else {
                println!("Қосу: {title}");
            }
        }
        Err(_) => println!("Оқу қатесі"),
    }
}
Басқа енгізу жоқ

Үлгі нәтиже бос ағын үшін берілген; Менің жоспарым енгізілсе, Қосу: Менің жоспарым шығады. read_line туралы ресми құжат.

Алдыңғы сабақ · Мазмұны · Келесі сабақ

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.