Ngân hàng câu hỏi của chương

Câu hỏi: PRF192 - Phần 8: Chuỗi ký tự

29 câu trắc nghiệm kèm lời giải của môn PRF192 - Cơ sở lập trình, xếp theo thứ tự nhập vào ngân hàng. Trang 2/2 — câu 21–29.

Danh sách câu hỏi

29/29 câuHết danh sách
AAs an array of characters
BAs an array of strings
CAs individual characters
DAs integers referencing ASCII values
Lời giải
Đáp án đúng: "As an array of characters". Trong C không có kiểu chuỗi dựng sẵn: một chuỗi chỉ là dãy ký tự liền kề kết thúc bằng ký tự rỗng, và hầu hết hàm trong string.h dò đúng ký tự kết thúc ấy để biết chuỗi dài bao nhiêu. Vì vậy khi cấp ô nhớ cho chuỗi phải tính thêm một ô cho ký tự kết thúc. Lựa chọn "As an array of strings" mô tả một danh sách nhiều chuỗi, tức mảng con trỏ ký tự hay mảng hai chiều, không phải cách biểu diễn một chuỗi. Lựa chọn "As individual characters" nói về kiểu char đơn lẻ; một ký tự rời không có ký tự kết thúc nên các hàm chuỗi không làm việc được với nó. Lựa chọn "As integers referencing ASCII values" đúng ở chỗ mỗi ký tự được lưu bằng mã số, nhưng chuỗi không phải mảng số nguyên và cũng không bỏ được ký tự kết thúc.
Mở trang câu hỏi này →
22What is the output of the following program?4 lựa chọncó code
Đề bài
#include <stdio.h>
#include <string.h>
int main() {
    char s1[] = "FPTU";
    char s2[] = "fpt";
    char s3[] = "FPTU";
    printf("%d %d %d", strcmp(s1,s2), strcmp(s1,s3), strcmp(s2,s3));
    return 0;
}
A-1 0 1
B2 0 -2
C1 0 2
D1 0 -1
Lời giải
Đáp án đúng: "-1 0 1". Hàm strcmp so hai chuỗi theo mã ký tự tại vị trí lệch đầu tiên và chỉ cam kết dấu của giá trị trả về. So chuỗi viết hoa với chuỗi viết thường thì cặp lệch đầu tiên nằm ngay ký tự đầu: mã chữ hoa nhỏ hơn mã chữ thường nên kết quả âm. So chuỗi viết hoa với chuỗi giống hệt nó cho 0. So chuỗi viết thường với chuỗi viết hoa cho giá trị dương vì đảo chiều của phép so đầu. Thư viện của Visual Studio chuẩn hoá về -1, 0 và 1 nên dãy in ra khớp lựa chọn này; cần biết thư viện khác có thể trả về đúng chênh lệch 32 đơn vị, chỉ dấu là bất biến. Lựa chọn "2 0 -2" sai dấu ở cả hai đầu. Lựa chọn "1 0 2" cho kết quả dương ở phép so đầu, trái với việc chữ hoa đứng trước chữ thường trong bảng mã. Lựa chọn "1 0 -1" đảo dấu cả hai phép so khác 0.
Mở trang câu hỏi này →
ACharacter array, Ary is a string
BAry has no Null character at the end
CString size is not mentioned
DThe string can not contain special characters
Lời giải
Đáp án đúng: "Character array, Ary is a string". Khai báo này tạo một mảng ký tự và khởi tạo nó bằng một hằng chuỗi, nên nó vừa là mảng char vừa là chuỗi theo nghĩa của C: dãy ký tự liền kề có ký tự rỗng đóng cuối, dùng được ngay với printf hay các hàm trong string.h. Lựa chọn "Ary has no Null character at the end" sai vì hằng chuỗi luôn kèm ký tự kết thúc, trình dịch cấp chín ô nhớ cho tám ký tự nhìn thấy cộng một ô cho ký tự rỗng. Lựa chọn "String size is not mentioned" gây hiểu lầm: cặp ngoặc để trống không có nghĩa kích thước bỏ lửng, trình dịch suy ra đủ chín ô ngay lúc dịch và kích thước đó cố định về sau. Lựa chọn "The string can not contain special characters" sai vì dấu chấm và dấu chấm than là ký tự bình thường, chuỗi chứa được mọi ký tự kể cả dãy thoát.
Mở trang câu hỏi này →
24What is the output of the following code snippet?4 lựa chọncó code
Đề bài
char str1[] = "Hello";
char str2[10];
strcpy(str2, str1);
ACopies content of str1 into str2
BCompares str1 with str2
CRetrieves the length of str1
DAssign str2 to an empty string
Lời giải
Đáp án đúng: "Copies content of str1 into str2". Trong C, chuỗi chỉ là mảng ký tự kết thúc bằng một byte rỗng, nên ngôn ngữ không có phép gán chuỗi: muốn sao nội dung phải gọi một hàm đi từng ký tự. strcpy nhận đích trước, nguồn sau, chép lần lượt sáu byte của str1 gồm năm chữ cái của Hello cộng byte kết thúc vào str2, và vì str2 có mười ô nên không tràn. Mô tả "Compares str1 with str2" là việc của strcmp, hàm trả về số âm, số không hay số dương chứ không ghi gì vào đích. Mô tả "Retrieves the length of str1" là việc của strlen, nó chỉ đếm ký tự tới trước byte kết thúc rồi trả về một số nguyên. Mô tả "Assign str2 to an empty string" ứng với việc đặt phần tử đầu của str2 bằng byte rỗng, trái hẳn kết quả của đoạn mã vì sau khi chạy str2 mang nội dung Hello.
Mở trang câu hỏi này →
A5
B6
C4
DUndefined
Lời giải
Đáp án đúng: "5". Hàm strlen đếm số ký tự thực của chuỗi bằng cách đi từ byte đầu tới khi gặp byte rỗng kết thúc, và không tính byte đó. Chuỗi hello có năm chữ cái nên hàm trả về 5, dù mảng str chiếm sáu byte trong bộ nhớ. Đây là ranh giới cần nhớ: strlen cho độ dài logic, còn sizeof cho kích thước vùng nhớ. Số "6" chính là sizeof(str), tức năm ký tự cộng byte kết thúc, không phải thứ strlen trả về. Số "4" thiếu một ký tự, chỉ đúng nếu chuỗi là hell. Kết luận "Undefined" sai vì mảng được khởi tạo từ hằng chuỗi nên byte kết thúc đã có sẵn, strlen tìm thấy điểm dừng hợp lệ và kết quả hoàn toàn xác định.
Mở trang câu hỏi này →
Đề bài
char s[] = "AbCd";
printf("%d;%d;%d;%d", s[1],  s[2],  s[3],  s[4]);
A97;98;99;100
B65;66;67;68
C65;98;67;100
D98;67;100;0
Lời giải
Đáp án đúng: "98;67;100;0". Mảng s chiếm năm byte: bốn chữ cái và byte rỗng kết thúc ở chỉ số 4. Mỗi phần tử là một char, in bằng %d nên giá trị được nâng lên int và hiện ra dưới dạng mã ASCII. Chỉ số đếm từ 0, vậy s[1] là chữ b thường mã 98, s[2] là chữ hoa thứ hai mã 67, s[3] là chữ d thường mã 100, còn s[4] là byte kết thúc mang giá trị 0. Dãy "97;98;99;100" là mã của bốn chữ thường liên tiếp, tức giả định chuỗi toàn chữ thường và đọc từ chỉ số 0. Dãy "65;66;67;68" là mã của bốn chữ hoa liên tiếp, cũng không khớp vì chuỗi xen chữ thường. Dãy "65;98;67;100" đọc từ s[0] nên lấy mã chữ hoa đầu tiên, lệch một nhịp so với yêu cầu của đề.
Mở trang câu hỏi này →
A14
B3
C10
D0
Lời giải
Đáp án đúng: "3". Trong hằng chuỗi, dãy gồm dấu chéo ngược và số không là một ký tự duy nhất, chính là byte rỗng dùng để đánh dấu kết thúc chuỗi. Khi trình dịch dựng hằng này, vùng nhớ lần lượt chứa ba chữ in hoa của FPT, một byte rỗng, mười chữ của University, rồi một byte rỗng nữa, tổng cộng mười lăm byte. Hàm strlen đi từ byte đầu và dừng ở byte rỗng đầu tiên, nên nó chỉ đếm được ba ký tự. Số "14" là số chữ cái nhìn thấy trên mặt chữ, tức cách đếm bỏ qua ý nghĩa của byte rỗng. Số "10" là độ dài của phần đứng sau byte rỗng, phần mà strlen không bao giờ chạm tới. Số "0" chỉ đúng nếu ký tự đầu tiên đã là byte rỗng, trong khi ở đây byte đầu là một chữ in hoa.
Mở trang câu hỏi này →
28What is printed?4 lựa chọncó code
Đề bài
char sentence[81] = "This is a test";
int n = strlen(sentence);
printf("%d", n);
A13
B14
C15
DCompilation error
Lời giải
Đáp án đúng: "14". Mảng sentence có tám mươi mốt ô nhưng được khởi tạo từ hằng chuỗi, nên chỉ phần đầu mang nội dung, ô ngay sau chữ cuối giữ byte rỗng kết thúc và các ô còn lại cũng bằng không. Hàm strlen đếm số ký tự tới trước byte kết thúc, kể cả dấu cách: bốn chữ của This, một dấu cách, hai chữ của is, một dấu cách, một chữ a, một dấu cách rồi bốn chữ của test, cộng lại đúng 14. Số "13" là kết quả khi bỏ sót một dấu cách, lỗi đếm thường gặp vì dấu cách không nhìn thấy rõ. Số "15" là số byte chuỗi thật sự chiếm, tức mười bốn ký tự cộng byte kết thúc. Kết luận "Compilation error" sai vì khởi tạo mảng char tám mươi mốt ô bằng một chuỗi ngắn hơn là hợp lệ.
Mở trang câu hỏi này →
29What will be the result of the following C code?4 lựa chọncó code
Đề bài
char str1[20] = "Hello";
char str2[20] = "World";
strcat(str1, str2);
printf("%s", str1);
AHelloWorld
BHello World
CWorldHello
DWorld Hello
Lời giải
Đáp án đúng: "HelloWorld". Hàm strcat tìm byte rỗng kết thúc của chuỗi đích rồi chép chuỗi nguồn vào từ đúng chỗ đó, kèm một byte kết thúc mới; nó không tự chèn dấu cách và cũng không đổi thứ tự. Vậy str1 vốn là Hello được nối thêm World ngay sau chữ cuối, cho HelloWorld dài mười ký tự, vẫn vừa trong mảng hai mươi ô nên không tràn. Chuỗi "Hello World" đòi một dấu cách ở giữa, muốn có thì phải nối thêm một chuỗi chứa dấu cách trước khi nối từ thứ hai. Chuỗi "WorldHello" đảo vai hai chuỗi: strcat luôn ghi vào tham số đầu, nên muốn kết quả đó phải gọi với str2 làm đích. Chuỗi "World Hello" vừa đảo vai vừa thêm dấu cách, không khớp điều gì trong lời gọi.
Mở trang câu hỏi này →