Tại sao giá trị trả về của scanf là 1 mà không phải giá trị nhập vào?

Mình vẫn đang đợi câu trả lời của bạn @luantran11490. Thêm 1 câu hỏi khác, nếu bạn cho rằng hàm scanf ngầm trả về 1 cái gì đó, vậy hàm scanf trả về giá trị gì 1 cách lộ liễu?

2 Likes

lộ liễu? Viết thêm code thì là ngầm hả bạn?đấy là bạn muốn nó tường minh ra r chứ k phải là ngầm nữa.đơn giản thôi,bạn gọi độc cái hàm scanf ra ,xong gõ giá trị theo số lượng vào,như ví dụ của bạn thì 2 đối số a,b. Xong enter xem nó có in tường minh ra thêm cái số lượng biến bạn đã nhập k. Nếu in ra thì đó mới gọi là tường minh,còn bạn dùng 1 biến khác để gán cho hàm sau đó in biến này ra thì là do bạn tác động r,chứ k phải bản thân hàm trả về như vậy . Tương tự như hàm printf,cũng làm gì trả về số ký tự nhập,vẫn phải gán biến r in cái biến đấy ra.

Gì thế này? Giờ bạn còn không biết phép gán hoạt động như thế nào nữa kìa.

Bạn hổng kiến thức trầm trọng rồi đấy.

Bạn đang cố chứng minh điều gì ?

Wow,ra cũng chỉ là bạn muốn nói gì đó.k sao ,nói đi bạn. Toán gì thì mình k biết,nhưng cái kiểu code này của bạn k đúng kiểu tớ nói ở trên,tức là hàm trả về luôm chứ k phải gán biến, còn bạn muốn chỉ dạy tớ về kiến thức bên ngoài phạm vi của chủ đề ở trên thì tớ xin lắng nghe và học hỏi.
Tớ xin chốt lại là : cái dòng code trên vd của tớ k có 1 cái biến nào gán thêm vào, nên hãy nói trong pham vi của nó.

Đây là những gì mình muốn nói.

Bạn càng cố nói thì càng chứng tỏ nhận định trên của mình là đúng thôi.

3 Likes

cảm ơn bạn đã góp ý. :smiley:

Nếu bạn thích thì mình chiều.

#include <stdio.h>

int main(void) {
	int a = -1, b = -1; // initialization
	while (scanf("%d %d", &a, &b) == 2) {
		printf("You are so smart!\n");
	}
	printf("%d %d\n", a, b);
}

Nhập vào

1 abc
2 abc
3 abc
4 abc
abc 1
abc 2
abc 3
abc 4
3 Likes

ôi chắc tớ nên xóa mấy cái này thôi bạn nhỉ? để tớ nói lại : đầu tiên là tớ dựa vào cái code “while(scanf(”%d%d",&x,&y) ==2) " để suy luận theo cách TỚ HIỂU rằng : hàm scanf hẳn là ngầm trả về 1 giá trị nguyên ,biểu diễn cho số lượng đối số nhập vào". và bạn kia tranh luận rằng tớ dùng thuật ngữ và lập luận bừa bãi . bạn ấy bảo đấy k phải là đối(hay đối số) mà nó là argument. Sau đó tớ check lên thì ý nội dung của bạn ấy cũng giống như ý mình trình bày reply chủ topic,chỉ khác là bạn ấy dùng từ “argument” thay vì “đối số”. và bạn ấy nói là hàm scanf tường minh trong việc trả về số lượng đối số đã nhập. Vậy thì tại sao :
scanf("%d %d",&x,&y) ->nhập vô 98,99 đi xong enter
nếu là tường minh thì sau cái enter nó phải hiện thêm giá trị 2 : thể hiện số lượng đối số nữa.
chứ k phải là phải dùng printf để in ra , vì vậy mình nói là mình NGẦM hiểu cái “while(scanf(”%d%d",&x,&y) ==2) " scanf sẽ NGẦM trả cho tớ giá trị 2 , để tớ mang giá trị này so sánh với cái điều kiện của vòng while.
chứ k lan man sang cái vấn đề của bạn đâu

Mình code y chang ý của bạn, bạn còn muốn đòi hỏi cái gì nữa?

Người dùng nhập vào là 1 việc công khai và rất tường minh, bạn muốn cái gì tường minh hơn nữa?

1 Like

ok để tớ nói ý hiểu của tớ như này nhé : trong tiếng việt k có từ argument,và nếu tra từ điển thì nó dịch là “đối số”.định nghĩa đối số : là những gì thực tế ta mang vào khi gọi tới 1 hàm,đối số hay cái từ argument mà bạn coi nó k phải là thuật ngữ có 3 loại : loại biến thông thường, con trỏ và tham chiếu( tham chiếu chính là địa chỉ kèm theo cái ký tự “&”).Và tớ chắc chắn 1 điều là ở hàm scanf k dùng biến kiểu thường,1 là con trỏ 2 là địa chỉ.Vì vậy cái cách tớ nói “hàm scanf ngầm trả về 1 giá trị số nguyên = số lượng đối số (hoặc số ký tự “&”-ngoại trừ mảng k có dấu “&”) có trong hàm” chả có gì k hợp lý cả, chắc nên thay thuật ngữ đối số = thuật ngữ “argument”,nhưng mà do tớ quen từ đối số với **tham số ** hay thuật ngữ C gọi là parameter học ở toán lớp 9 r nên cách nói khác của bạn vậy. suy cho cùng thì tớ nói tiếng việt còn bạn nói tiếng anh,k hiểu nhau cũng là bt thôi :smiley:.bạn còn k hiểu tớ đang nói gì thì làm sao mà nói chuyện đc.

Uhm, vậy là cậu đã thừa nhận cậu đưa ra false statement rồi đó :smile:
Cơ mà, đừng đánh lận sang việc “không hiểu nhau cũng là bình thường thôi”. Nếu cậu đọc bản gốc (với việc không hiểu từ tiếng Anh thông dụng argument, tớ đồ là cậu cũng chưa đọc), họ dùng từ “items of the argument list” để chỉ cho đối số gán được (và cậu chỉ có thể gán được nếu cậu pass by reference - tự tra từ điển nếu cậu không hiểu nha :smile:)


Về thuật ngữ “ngầm trả về”, tớ thấy cậu có vẻ bảo thủ với việc thuật ngữ đó là đúng.
Phần cậu giải thích lý do cậu dùng thuật ngữ đó cho thấy một lần nữa, cậu thừa nhận cậu đã “đoán” (đoán không phải điều xấu. Đoán mà không chứng minh là điều xấu). Document của scanf (tớ khuyến khích cậu đọc) có nói rõ nó được design để trả về cái gì. Không có gì là “ngầm” ở đây cả :smile:


Bạn lại bảo đừng suy luận bừa :smiley:,ct chạy đúng ý định<=>chứng tỏ code while đúng=> chả có lý do gì mà cái đk trong cái ngoặc của while k đúng cả

Tớ có nói rõ đoạn cậu sai ở comment trước rồi đó :smile:

Thì theo cách hiểu của tớ,nếu lặp while kia chạy mà ta nhập thừa 1 tham số chương trình sẽ kết thúc .

Đoạn in đậm trên là sai, chứ không phải đoạn trả về giá trị gì. Làm ơn đọc hiểu giúp tớ với :smile:
Cậu suy luận bừa đoạn đó, đúng chứ? :smile:

Tớ một lần nữa nhấn mạnh, cậu suy luận đúng 1 nửa (scanf trả về số lượng đối số được gán - đã hơn 1 lần tớ nói là tớ không phủ định điều đó. Cậu làm ơn đọc hiểu giúp tớ với :smile: ), nhưng không có nghĩa là cậu đã hiểu đúng (lý do phần in đậm kia sai là vì cậu chưa thử code để xác nhận giả thiết đó).


Sau cùng,tớ xin bày tỏ rằng tớ k có ý định làm 1 kỹ sư gì gì đó,tớ chỉ là ng hay tò mò về các vấn đề liên quan đến cái máy tính hoạt động bt,nên tớ tìm hiểu C ,cũng mới đc 1,2 tháng dịch trở lại đây

Uhm, tớ hiểu rồi. Tớ cũng hi vọng, nếu trong tương lai cậu đổi ý, cậu sẽ nghiêm túc sửa những vấn đề về mindset tớ đã đề cập lúc trước. Sẽ tốt hơn cho cậu.
Cũng xin lỗi cậu vì đã để topic này đi hơi xa. Kiểu người như cậu chính xác là lý do tớ ở diễn đàn này. Tớ gặp không ít các kỹ sư có tính cách như cậu:

Một kỹ sư vừa lười đọc doc, vừa thích đưa ra các giả thiết nhưng không chứng minh, vừa dùng thuật ngữ mà chỉ mình anh ta hiểu, lại không biết lắng nghe, là kiểu kỹ sư mà không một tổ chức nào muốn làm việc cùng.

Tớ cũng hi vọng những bạn nghiêm túc muốn trở thành kỹ sư cũng sẽ nhận thức và sửa đổi (nếu không may các bạn ấy cũng có tính cách này).


tiện nói về ng VN,tớ cũng thấy k ít ông bảo thủ,trong đó có tớ,cũng k ít ông lúc nào cũng đem cái chủ nghĩa kinh nghiệm theo bên mình

Ừ, cậu bảo thủ thật :smile:
Tớ cũng có thấy nhiều người đem chủ nghĩa kinh nghiệm bên mình. Tớ thì flexible hơn, dù có lẽ tớ có kinh nghiệm hơn, nhưng tớ cũng thường chỉ dừng lại ở mức “cho lời khuyên về best practice” một cách humble, chứ không khoe kinh nghiệm bản thân để làm dẫn chứng, như những người cậu đã gặp.


cảm ơn bạn đã đọc và góp ý cho tớ.

You’re welcome! :smile:

7 Likes

Nhắc nhẹ bạn 1 câu: thái độ thôi được rồi, bạn đúng tôi sai là một thái độ rất tồi, chỉ chứng tỏ là bạn không cam tâm và vẫn không hiểu vấn đề thôi.

2 Likes

tôi đã nhận và xin lỗi mọi người và bạn ấy rất rõ ràng rồi bạn à.Thái độ tồi hay k thì k do bạn quyết định , bởi tớ k tranh luận với bạn.hơn nữa tôi k muốn đi xa thêm ngoài cái chủ đề tôi nhận lỗi .nên đừng khắt khe quá bạn à :laughing:.Vấn đề của tôi là tôi k diễn đạt đc những thứ tôi hiểu cho mọi người và ng tranh luận với tôi phê phán điều này, tôi nhận và xin lỗi rất rõ ràng,chỉ ra điểm mấu chốt và lỗi…nhưng k vì thế mà ai đó đc quyền lan man chuyển qua đánh giá tư cách của ng khác bạn nhé, nếu tôi k nói dừng thì có thể chuyện sẽ đi xa hơn mà k còn trong chủ đề nữa.thê nhé, chúng ta dừng chủ đề, tớ nhận lỗi tiếp

1 Like

Uhm, cậu nhận lỗi là tốt rồi. Tất cả mọi người đều thấy cậu nên làm vậy :clap:
Have a nice day! (Cậu cũng nên làm quen với việc sử dụng tiếng Anh ở thế giới này nha. Công việc của bọn tớ sử dụng tiếng Anh rất thường xuyên, nên sử dụng thêm tiếng Anh trong trao đổi kỹ thuật hoàn toàn bình thường và healthy, thậm chí sẽ bất thường nếu ai đó chỉ biết dùng từ thuần Việt trong context kỹ thuật. Nếu cậu không hài lòng lắm và không muốn học tiếng Anh, cậu có thể giữ điều đó cho riêng mình, và dùng google dịch nếu cậu thực sự muốn hiểu người khác nói gì, không ai phiền nếu cậu làm điều đó cả).

3 Likes

Đúng r. tớ k hài lòng, vì đơn giản , tớ lên đây tìm kiến thức để phục vụ cho cách hiểu của bản thân tớ về cái hàm scanf nó trả về giá trị hay k trong ví dụ tớ nêu ra,nếu chỉ cần bạn cho tớ xin 1 cái dòng code đơn giản : printf("%d",scanf("%d",&a)); thì tớ nhận đc đáp án r trả lời cho cái lập luận của tớ là : “hàm scanf trả về 1 giá trị tương ứng với số đối số khai trong hàm”.điều tớ cần chỉ có vậy(nhưng mà do lỗi tớ trình bày kém nên xảy ra hiểu lầm), còn bạn phải "

(để rep cmt của tớ)",r lan mang sang cả chuyện tư cách ,nhân phẩm,uốn nắn,… :smile:k ít hơn 1 lân.Cuối cùng thì tớ lại tự tìm đc cái code trả về giá trị cho scanf ở 1 trang khác mà k phải ở đây :joy: .Nên tớ nghĩ nhận lỗi và kết thúc chủ đề mình cần đc r.Cảm ơn bạn đã rộng lượng đón nhận lời xin lỗi của tớ.Chúc bạn nhiều sức khỏe :slightly_smiling_face:

Cậu không thể dừng đổ lỗi được, phải không? :smile:

Đây sẽ là lần cuối tớ reply lại những thứ nonsense của cậu, chủ yếu để các bạn trẻ khác biết và tránh lặp lại sai lầm như cậu, không phải vì cậu, vì tớ biết cậu sẽ không hiểu gì những gì tớ nói.

  1. Tớ đã không biết level của cậu cần phải bón tới tận miệng.
    Tớ đã nói về cách in giá trị của scanf ở comment thứ 2 tớ reply cậu đó.

Cậu cũng hoàn toàn có thể in giá trị trả về của scanf bằng printf

Có lẽ do cậu đã quá bận bịu chứng minh một thứ chỉ có trong tưởng tượng của cậu, bằng logic tệ hại (việc diễn đạt tồi là một outcome của việc này) và trình độ đọc hiểu tồi tệ của cậu, nên cậu miss mất đoạn này chăng?

  1. Cậu lên đây để tìm kiến thức, vậy sao cậu không đọc các comment trước đã nói gì?
    Cậu đi tìm kiến thức, hay đi tìm nơi show off khả năng đoán + ego nhỏ bé của cậu?
    Nếu cậu có đọc các comment trước khi cậu viết comment đầu tiên, cậu sẽ không có lý do gì để viết comment đó cả. Tất cả mọi thứ đã rõ ràng, từ trước khi cậu đoán.
    Và nếu cậu không viết 1 lời đoán đúng 1 nửa, tớ đã không comment để chỉnh lại, với mục đích thân thiện là giúp cậu hiểu đúng, không phải để chứng minh cậu sai, như cách cậu đã cố làm với tớ một cách điên rồ (cậu sợ bị nói là sai lắm, phải không?).

  2. Tớ đã chỉ cho cậu biết tất cả những vấn đề của cậu, vì vấn đề của cậu không phải chỉ dừng ở scanf trả về gì. Lý do đơn giản, vì tớ muốn cho cậu cơ hội để cải thiện, không phải là để làm xấu mặt cậu (tớ biết thế giới của cậu toàn những người thích chỉ trích và đổ lỗi cho nhau, thế giới của tớ thì không).
    Nếu cậu thực sự là người tìm kiếm kiến thức như cậu nói, thay vì người thích show off ego bé nhỏ của cậu để che đi sự tự ti như cách cậu đang thể hiện, cậu nên tiếp thu với thái độ khác.
    Nếu cậu làm theo, tốt cho cậu, và tớ happy với điều đó.
    Nếu cậu không muốn, đơn giản là ignore nó đi. Tớ không quan tâm đời của cậu sẽ thảm hại ra sao nếu như cậu vẫn sống với vấn đề của cậu.

  3. Tớ sẽ không đưa bất cứ bình luận nào về những gì diễn ra sau comment này từ cậu.
    To be frank, tớ không thích nói chuyện với những người narrow mind như cậu. Cậu đơn giản chỉ muốn thấy cái cậu thấy.
    Chẳng có lợi ích gì cho tớ khi phải hiểu cách diễn đạt tồi tệ của cậu cả.
    Vì cậu chẳng biết cách dừng lại, tớ sẽ giúp cậu, bằng cách đưa tất cả các comment tiếp theo của cậu vào “off-topic”.


Cảm ơn bạn đã rộng lượng đón nhận lời xin lỗi của tớ.Chúc bạn nhiều sức khỏe :slightly_smiling_face:

Cảm ơn cậu về lời có giá trị này nhé! :smile: Tớ cũng chúc cậu nhiều sức khỏe!

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