30/09/2018, 19:25

So sánh chuỗi nhập vào với chuỗi có sẵn

#include <conio.h>
#include <stdio.h>
int main(){
	char mangkitu[]="";
	printf("nhap chuoi: ");
	gets(mangkitu);
	if(mangkitu=="dnh")
		printf("YES");
	else
		printf("NO");
	getch();
	return 0;
}

khi nhập vào dnh thì mangkitu[] sẽ có 4 phần tử (cộng thêm kí tự kết thúc chuỗi ‘’). vậy mình phải so sánh như thế để điều kiện if đúng và in ra YES

Khôi Trần viết 21:30 ngày 30/09/2018

Thứ nhất tự giác gg, hay đơn giản trong bất kì quyển giáo trình nào cũng nhắc đến hàm strcmp
Thứ hai có thể tự viết hàm này bằng cách so sánh lấn lượt từng kí tự của 2 xâu

viết 21:29 ngày 30/09/2018

So sánh 2 chuỗi thì dùng hàm strcmp còn so sánh các kí tự trong 2 chuỗi thì dùng hàm strncmp nhé.
http://www.cplusplus.com/reference/cstring/strcmp/
http://www.cplusplus.com/reference/cstring/strncmp/

Nguyễn Minh Trí viết 21:35 ngày 30/09/2018

Thứ nhất tự giác gg, hay đơn giản trong bất kì quyển giáo trình nào cũng nhắc đến hàm strcmpThứ hai có thể tự viết hàm này bằng cách so sánh lấn lượt từng kí tự của 2 xâu

So sánh 2 chuỗi thì dùng hàm strcmp còn so sánh các kí tự trong 2 chuỗi thì dùng hàm strncmp nhé.

char mangkitu[]="";
printf("nhap chuoi: ");
gets(mangkitu);
if(strcmp(mangkitu,"dnh")==0)
	printf("YES");
else
	printf("NO");

nếu dùng hàm xử lý chuỗi thì dễ rồi, ý mình hỏi là có cách nào để so sánh trực tiếp 2 chuỗi với nhau bằng phép toán == được k?
chuỗi nhập vào sẽ có thêm kí tự ‘\0’ nhưng mình thêm kí tự ‘\0’ vào chuỗi có sẵn mà sao nó vẫn trả về kết quả sai

#include <conio.h>
#include <stdio.h>
int main(){
	char mangkitu[]="";
	printf("nhap chuoi: ");
	gets(mangkitu);
	if(mangkitu==("dnh"+'\0'))
		printf("YES");
	else
		printf("NO");
	getch();
	return 0;
}
viết 21:41 ngày 30/09/2018

Phép so sánh == không dùng để so sánh nội dung của 2 chuỗi được.

Câu hỏi và giải đáp của bạn đều có ở đây nhé.
http://diendan.congdongcviet.com/threads/t50872::2-chuoi-giong-nhau-nhung-lai-ko-bang-nhau-khi-so-sanh.cpp

Nguyễn Minh Trí viết 21:34 ngày 30/09/2018

oh! mình hiểu rồi, cám ơn bạn nhiều!

Pham Van Hai viết 21:31 ngày 30/09/2018

char mangkitu[]="";

Góp ý với bạn là đoạn trên không hợp lệ về mặt logic. Theo mình hiểu bạn định khai báo cách đó để áp ụng cho nhập xâu tùy ý. Nhưng về mặt logic là sai vì sau câu lệnh đó mangkitu chỉ có kích thước là 1 (chứa ký tự \0). Bạn phải khai báo kích thước của mangkitu hoặc dùng cấp phát động.

Nguyễn Minh Trí viết 21:36 ngày 30/09/2018

mình xem video của anh @ltd thì chỉ thấy cách khai báo kích thước mangkitu hoặc dùng cấp phát động theo như bạn nói, mà sao khi khai báo char mangkitu[]= ""; thì chương trình vẫn chạy đúng, mình cũng thắc mắc lâu lắm rồi mà chưa giải đáp được, sẵn tiện bạn biết thì bỏ chút thời gian giải thích giúp mình được k? mình cảm ơn nhiều

Pham Van Hai viết 21:31 ngày 30/09/2018
  • Bộ nhớ của máy tính được tổ chức theo các ô nhớ liên tiếp nhau. Khi bạn khai báo một mảng có kích thước n thì nó sẽ cấp phát cho bạn n * (kích thước của từng kiểu dữ liệu, ví dụ: char - kích thước 1 byte, short int - kích thước 2 byte). Nhưng bạn có vẫn dùng được array[n+1] nếu như vùng nhớ đó free, không bị chương trình nào dùng. C không quan tầm và không check kích thước của mảng. Mà lập trình viên phải làm điều đó.
  • Trong trường hợp của bạn mảng mangkitu chỉ có 1 byte nhưng tại sao bạn vẫn dùng được là vì có thể vùng nhớ lân cận mangkyti vẫn đang free, không có chương trình nào dùng cả, nhưng nếu có chương nào đang dùng thì chương trình của bạn sẽ bị lỗi ngay (chỉ xảy ra khi chạy chương trình) và đây gọi là lỗi run-time.
Bài liên quan
0