01/10/2018, 11:27

Thắc mắc về đoạn code tìm kiếm và thay thế chuỗi (khác nhau i++ và ++i) trong lập trình C

#include <stdio.h>
#include <string.h>
#include <conio.h>

char *str_str (char *s, char *s1, char *s2)
{
	int len = strlen (s);
	int len1 = strlen (s1);
	int len2 = strlen (s2);
	int i = 0, j, luu;
	if (len1 != 0)
		while (i < len)
		{
			if (s[i] == s1[0])
			{
				j = 0;
				luu = i;
				while (s1[++j] == s[++luu] && j < len1);
				if (j == len1)
				{
					memmove (&s[i + len2], &s[i + len1], len - i - len1 + 1);
					memcpy (&s[i], s2, strlen(s2));
					len = len - len1 + len2;
					i += len2;
				}
				else i++;
			} else i++;
		}
		return s;
}

void main()
{
	char s[255], s1[50], s2[50];
	printf ("
Nhap chuoi cha: ");
	gets (s);
	printf ("
Nhap chuoi can tim: ");
	gets (s1);
	printf ("
Nhap chuoi thay the: ");
	gets (s2);
	str_str (s,s1,s2);
	printf ("
chuoi sau khi thay the la: %s", s);
	getch();
}

đề bài tìm và thay thế chuỗi s1 trong chuỗi s bằng chuỗi s2
có 2 trường hợp:

+1 là while ((s[luu++] == s1[j++]) && (j < len1)) ;
In ket quả
Nhap chuoi cha: maikhongra
Nhap chuoi can tim: khi
Nhap chuoi thay the: 1234
chuoi sau khi thay the la: mai1234ngra (sai)

+2 là while ((s[++luu] == s1[++j]) && (j < len1)) ;
In ket quả
Nhap chuoi cha: maikhongra
Nhap chuoi can tim: khi
Nhap chuoi thay the: 1234
chuoi sau khi thay the la: maikhongra (oke kết quả đúng vs điều kiện)

Bạn nào có thể chỉ cho mình các bước của j++ với ++j vì sao có sự khác nhau này không? help help…

Tao Không Ngu. viết 13:33 ngày 01/10/2018

Hi Tỉnh Vũ Văn.
Một cái cộng trước một cái cộng sau.

Tỉnh Vũ Văn viết 13:42 ngày 01/10/2018

Bạn ơi mình thấy 1 trường hợp khi kết thúc hàm while thì không xét tới ky tự cuói cùng, 1 cái thì có, nhưng mình vẫn không thực sự hiểu thứ tự tăng j trong vòng while lắm bạn có thể nói rõ hơn giùm mình dc ko

HK boy viết 13:37 ngày 01/10/2018

truy vấn s[j++] tương đương với truy vấn s[j] rồi j = j + 1
truy vấn s[++j] tương đương với j = j + 1 rồi truy vấn s[j]

rogp10 viết 13:37 ngày 01/10/2018

Góp ý là bạn đặt tên tham số không biết đường nào mà gọi hàm

Tỉnh Vũ Văn viết 13:39 ngày 01/10/2018

bạn ơi mình chỉ cho mình xem các bước vòng while thực hiện như vậy có đúng không:

Trường Hợp while( s[luu++] == si [j++] && (j < len1));

Nhap chuoi cha: maikhongra
Nhap chuoi can tim: mao (không xét chữ cuối)
Nhap chuoi thay the: 1234
chuoi sau khi thay the la: 1234khongra (kết quả là sai)

ta có : len1 = 3
j = 0, luu = 0 && 0 < 3 (đúng tiếp tục while so sánh m)
j = 1, luu = 1 && 1 < 3 (đúng tiếp tục while so sánh a)
j = 2, luu = 2 && 2 < 3 (so sánh i vs o sai dừng vòng while nhưng do j++ nên j = 3 và j == len 1 nên cây lệnh thay thế vẫn thực hiện)

Mình vừa viết đến dòng j mới hiểu ra, “tưởng tượng kém quá”, cảm ơn mn nhiều cuối cùng ình cũng hiểu

Bài liên quan
0