Hỏi về ký tự đặc biệt sau khi dùng std::flush trong c++?

Mọi người cho mình hỏi ký tự phần trăm tô đen như trong hình là sao vậy và làm sao để bỏ được nó ?

#include <iostream>
int main() {
    std::cout << "Text" << std::flush;
    std::cout << "\nText1" << std::flush;
    std::cout << "\nText2" << std::flush;
    std::cout << "\nText3" << std::flush;
    return 0;
}

Screen Shot 2022-03-19 at 17.11.30

Thay vì dùng \nstd::flush thì bạn có thể dùng std:endl đã bao gồm cả \nstd::flush rồi.
Còn lý do nó ra kí tự lạ ở cuối thì chư rõ. Có thể là Hành vi bất định (Undefined Beahavior).

1 Like

Mấy lệnh trên mình thêm \n vào để thể hiện là nếu sau std::flush có ký tự nào khác thì nó không xuất hiện ký tự lạ đó nữa. Lệnh xuất Text3 cuối cùng không có gì sau std::flush nên mới có ký lạ đó. Bạn có cách nào mà không cần dùng std:endl không, mình chỉ muốn flush chứ không muốn thêm \n

Như mình đã nói:

Kết quả có thể khác nhau với trình biên dịch khác nhau. Bạn có thử trên trình biên dịch khác chưa?
Mình chạy trên trình biên dịch của một số trang web đều không thấy kí tự lạ nào.

1 Like

Cảm ơn bạn nhá, đều là gcc nhưng chạy trên mac terminal có ký tự lạ, còn trên powershell thì không

vậy là do mac dỏm nha :pensive:

câu hỏi tương tự: https://stackoverflow.com/questions/27238564/getting-a-weird-percent-sign-in-printf-output-in-terminal-with-c
https://stackoverflow.com/questions/62097474/why-does-a-percentage-appear-at-the-end-of-the-output-to-standard-out-but-not

@Kevin states: When (non-null) output from a program doesn’t include a trailing newline, zsh adds that color-inverted % to indicate that and moves to the next line before printing the prompt; it’s generally more convenient than bash’s behavior, just starting the command prompt where the output ended.

là do tính năng của loại shell đó, ví dụ zsh. Có lẽ là để tránh gây hiểu lầm khi output mà ko có \n cuối cùng để tách biệt với promt. ví dụ prompt là "user@computer$ " thì khi 1 chương trình output ko có ký tự newline cuối cùng nó sẽ in thành

user@computer$ ./a.out
Text
Text1
Text2
Text3user@computer$ 

nên có loại shell nó thêm ký tự % để ngăn cách thành Text3%user@computer$

cách khắc phục là đổi shell khác mà xài :unamused: hoặc đổi OS khác :unamused:

edit: cách khắc phục: https://superuser.com/questions/645599/why-is-a-percent-sign-appearing-before-each-prompt-on-zsh-in-windows/645612#645612
thêm dòng này trong ~/.zshrc

unsetopt PROMPT_SP

hoặc 3 dòng này

setopt PROMPT_CR
setopt PROMPT_SP
export PROMPT_EOL_MARK=""

hoặc tốt hơn là đốt zsh :star_struck:

7 Likes

Thanks bác :heart_eyes: :heart_eyes: :heart_eyes:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?