01/10/2018, 10:37

Lệnh scanf trong ngôn ngữ lập trình C

ở đây mình có 2 thắc mắc muốn hỏi các tiền bối
Thứ nhất mình có đoạn code sau ( lấy từ daynhauhoc )

#include <stdio.h>
int main()
{
    char x;
nhaplai:
    printf("

		 *A*");
    printf("

		 *B*");
    printf("nhap gia tri ");
    scanf("%c", &x);
    if(x =='g')
    {
        goto nhaplai;
    }
    getchar();
}

Nhập g lần thứ 2 thì sẽ dừng và được giải thích là do enter đã nhảy vào biến x của lần nhập thứ 2 dẫn đến != g và kết thúc.
Nhưng mình có đoạn code thứ 2 như sau :

#include<stdio.h>
main()
{
	char x;
	printf ("x la ");
	do
	scanf("%c",&x);
	while(x=='g');
	printf("....");
	}

Nhập g và kết thúc luôn, được giải thích là do đối với lệnh scanf này khi đọc kí tự ,thì với kí tự xuống dòng được coi là hợp lệ nên dẫn đến != g nên kết thúc.
đoạn code thứ 2 mình giải thích dựa trên sách còn đoạn code thứ nhất mình giải thích dựa trên nguồn trong nhóm và mình băn khoăn nếu với 2 cách giải thích trên thì ta thấy rằng enter của code 1 thì sẽ ảnh hưởng đến giá trị thứ 2 còn enter của thứ code 2 thì ảnh hưởng đến giá trị thứ nhất. Tiền bối nào có thể giải thích giúp mình với. Mình xin cảm ơn.

HK boy viết 12:44 ngày 01/10/2018
  • Format lại code bạn ơi. Thêm 3 dấu ` vào đầu và cuối code.
Tên Là Tiền viết 12:52 ngày 01/10/2018

code nào vậy abnj mình ko hiểu

anon71098895 viết 12:40 ngày 01/10/2018

1: Bấm eđit
2: Thêm “```” ở trước và sau câu

vd : include int main() { char x; nhaplai: printf("\n\n\t\t A"); printf("\n\n\t\t B"); printf("nhap gia tri "); scanf("%c", &x); if(x =='g') { goto nhaplai; } getchar(); }

Tên Là Tiền viết 12:50 ngày 01/10/2018

mình vừa mới lập nick và đăng bài luôn nên chưa tìm hiểu mong các bạn giúp đỡ.

anon71098895 viết 12:46 ngày 01/10/2018

Hoặc bạn có thể dùng [code]" Code c của bạn" [/code]

Tên Là Tiền viết 12:45 ngày 01/10/2018

cảm ơn bạn, bạn có thể giúp mình câu hỏi trong topic được không ?

HK boy viết 12:51 ngày 01/10/2018

Thực tình là mình không hiểu ý bạn muốn hỏi gì. Giá trị thứ 2 và giá trị thứ nhất bạn đề cập đến là gì?

Tên Là Tiền viết 12:42 ngày 01/10/2018

giá trị thứ 2 và thứ nhất tức là lần nhập g vào đầu tiên và lần nhập g vaò thứ 2 đó bạn

HK boy viết 12:51 ngày 01/10/2018

Đọc lại mấy lần và mình vẫn chưa hiểu bạn nói gì. Mình chỉ muốn nói thế này:

  • Không nên dùng goto.
  • Code đầu tiên:
- input 'g'
-> goto, quay về printf("*A");
- input 'a'
-> thoát
  • Code thứ 2:
input 'g'
-> break luôn, vì điều kiện ở while x == 'g' đã thoả mãn

Thế thôi, chả có kí tự enter liên quan gì ở code thứ 2.

  • Nếu bạn chưa hiểu while là gì, hãy học lại từ đầu. Đừng chỉ đi chép code suông.
Tên Là Tiền viết 12:52 ngày 01/10/2018

bạn ơi ở code thứ 2 khi nhập g vào thì vẫn thỏa mãn điều kiện vòng lặp mà,nên ko thể kết thúc vòng lặp do như vậy được, và ý mình giải thích ở đây là do lênh scanf trong code thứ 2 đã cho enter là kí tự hợp lệ dẫn đến giá trị nhập vào là khác g ấy. Code 2 mình ko chép ai bạn ah

HK boy viết 12:52 ngày 01/10/2018

Do code bạn lởm. Bạn có thể thấy, mình nhập cái gì cũng bay ra khỏi while hết.

Nếu muốn kiểm tra x, hãy đưa if(x == 'g') vào trong.

Tên Là Tiền viết 12:39 ngày 01/10/2018

2 code mình đều chạy được mà bạn

Tên Là Tiền viết 12:45 ngày 01/10/2018

ko phải thế bạn ơi …

Tên Là Tiền viết 12:50 ngày 01/10/2018

mình hiểu vòng lặp do while như sau:
do : thực hiện hành động sau đó while kiểm tra điều kiện
nếu điều kiện true thực hiện tiếp vòng lặp, false thì kết thúc mà
Chẳng lẽ mình hiểu vậy sai ah bạn

Tên Là Tiền viết 12:41 ngày 01/10/2018

thì ở đây nhập các giá trị khác g đương nhiên là ko thỏa mãn rồi ,còn nhập g ko thỏa mãn là do phím enter lệnh scanf nó hiểu đó là một kí tự hợp lệ.

HK boy viết 12:38 ngày 01/10/2018

nếu điều kiện true thực hiện tiếp vòng lặp, false thì kết thúc mà
Chẳng lẽ mình hiểu vậy sai ah bạn

Ok, mình sai, mình nhìn code sai vì code của bạn văng while ra. Với lại mình không code quen do while.

thì ở đây nhập các giá trị khác g đương nhiên là ko thỏa mãn rồi ,còn nhập g ko thỏa mãn là do phím enter lệnh scanf nó hiểu đó là một kí tự hợp lệ.

Nhập g thì liên quan gì đến phím enter hả bạn? Bạn chỉ đọc 1 kí tự thôi mà?

Tên Là Tiền viết 12:50 ngày 01/10/2018

ah cái này là mình đọc sách ban ah “scanf khi đọc kí tự thì nó cho các kí tự như dấu cách, tab, enter là hợp lệ hết” nên khi nhập g rồi nhấn enter thì mình nghĩ là máy sẽ hiểu kí tự ta nhập vào là khác g nên ko thỏa mãn.

HK boy viết 12:50 ngày 01/10/2018

Bạn hiểu sai ý của sách rồi.
Nếu

scanf("%c", &c);

và bạn input ‘g’ (có enter) -> c = 'g'
Còn input tab (có enter) -> c = '\t' (kí tự tab)

Chứ bạn nhập kí tự g thì dấu enter đằng sau đâu có ý nghĩa gì đâu. Enter ở đây là kết thúc việc nhập.

Kabuto viết 12:47 ngày 01/10/2018

mình đây bạn ơi tên la tiền đây, do hạn chế tin nhắn cho người mới nên vao nick khác

Kabuto viết 12:53 ngày 01/10/2018

vậy bạn có thể giải thích cho mình tại sao kết thúc được ko ? với lại nếu mình chèn thêm fflush (stdin);
thì sẽ thỏa mãn khi nhập g

Bài liên quan
0