30/09/2018, 23:02

Hỏi về hàm reset chuỗi

Chào mọi người.

Không biết có ai biết về hàm reset chuỗi không chỉ cho mình với, bên C/C++.

VD: char *a = "Hoc Lap Trinh", bây giờ em muốn reset chuỗi a này thành chuỗi rỗng (null) thì không biết có hàm nào hỗ trợ việc này không nhỉ mọi người ?

Xin cảm ơn !

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

This post was flagged by the community and is temporarily hidden.

Người bí ẩn viết 01:10 ngày 01/10/2018

Vậy giả sử như thế này thì sao anh?
char str[50] = "Hoc Lap Trinh"

Lúc đó reset bằng mấy kiểu kia nó báo lỗi ?

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

This post was flagged by the community and is temporarily hidden.

Người bí ẩn viết 01:09 ngày 01/10/2018

À quên, nếu thế thì không cần cần reset chuỗi cũng được !

OK anh

Đỗ Trung Quân viết 01:12 ngày 01/10/2018

Đầu tiên em phải chú ý là em muốn cả chuỗi bằng null hay reset value từng vị trí bằng 0. trong C null không hẳn là 0. null là dành cho pointer

Thuật ngữ nitpick:
Chuỗi không thể set to null, 1 chuỗi trong C là 1 mảng các ký tự mà ở đâu có có 1 ký tự null. Nếu không có ký tự null nó không thể passed to functions expecting (pointers to) strings (nghĩa là không thể trỏ tới). Trong C only object can be null. Đừng nhầm lẫn NULL macro với NUL character

Thứ 2. Là nơi là em khai báo chuỗi. Nếu là 1 biến global hoặc static thì giá trị của nó sẽ được khỏi tạo là 0 theo mặc định. Còn nếu là biến địa phương có thể dùng như này để set first value

str[50] = {0} cũng băng  char *a = 0;

Hoặc dùng memset(char *a, value t, size of a);

Người bí ẩn viết 01:18 ngày 01/10/2018

Tiếp tục thảo luận về Topic này !

Đề bài: Viết hàm tìm từ có độ dài lớn nhất trong chuỗi cho trước, in ra màn hình từ đó + độ dài tương ứng.

Source code:

void LngStrWrd(char *s) // tìm từ có độ dài lớn nhất trong chuỗi và in ra độ dài tương ứng
{ // "hoc lap trinhh"
	char *p = strdup(s);
	int len = strlen(p);
	char *str = NULL;
	char lngstr[50]; // gán cứng
	int Dem = 0, Max = 0, phantu = 0;
	for (int i = 0; i <= len; i++)
	{
		if ((p[i] >= 97 && p[i] <= 122) || (p[i] >= 65 && p[i] <= 90))
		{
			Dem++;
			lngstr[phantu++] = p[i];
		}
		if (p[i] == 32 || p[i] == '\0')
		{
			if (Dem > Max)
			{
				Max = Dem;
				str = NULL;
				str = strdup(lngstr);
			}
			phantu = 0;
			Dem = 0;
		}
	}
	printf("\nChuoi %s co do dai lon nhat la %d\n", str, Max);
}
int main()
{
        char s[30] = "tu canh minhh handsome";
        LngStrWrd(s);
	getch();
	return 0;
}

Tuy code em đã tìm ra được từ có độ dài lớn nhất trong chuỗi và in ra màn hình ok nhưng lúc in ra, cái chuỗi được in có thêm ký tự lạ, anh @Phong_Ky_Vo và @qtd với mọi người xem giúp em ạ.

Xin cảm ơn !

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

This post was flagged by the community and is temporarily hidden.

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

This post was flagged by the community and is temporarily hidden.

Người bí ẩn viết 01:15 ngày 01/10/2018

giai thuật có vấn đề.

Cũng không hẳn. Nếu thuật toán có vẫn để thì nó sẽ không thể in ra được cái từ có độ dài lớn nhất + độ dài của nó được.

Còn đằng này, nó vẫn in ra bình thường nhưng có điều là kèm theo ký tự rác.

Em nghi là chuỗi str lúc xử lý xong nó không bị “chặn” ở 1 ví trị kết thúc nên mới in ra 1 đống ký tự rác đằng sau (có thể)

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

This post was flagged by the community and is temporarily hidden.

Người bí ẩn viết 01:16 ngày 01/10/2018

Đã tìm được được lỗi, lỗi là không để ký tự kết thúc chuỗi.
sau line str = strdup(lngstr); phải thêm str[Dem] = '\0' nữa mới được (lỗi ngớ ngẫn quá).

Xin cảm ơn mọi người đã nhiệt tình giúp đỡ nhé

viết 01:14 ngày 01/10/2018

strdup ko phải là hàm chuẩn.

C thì xài sscanf, C++ thì xài stringstream mà bóc tách từng từ ra. Duyệt vòng for làm gì.

Người bí ẩn viết 01:05 ngày 01/10/2018

strdup ko phải là hàm chuẩn.

C thì xài sscanf, C++ thì xài stringstream mà bóc tách từng từ ra. Duyệt vòng for làm gì.

OK anh Em mới qua học chuỗi nên từ từ rồi nuốt, không ói ra phải nuốt lại mệt lắm !

Thanks anh

Đỗ Trung Quân viết 01:11 ngày 01/10/2018

@qtd với mọi người xem giúp em ạ.

Xong trận LOL đã =))

Đỗ Trung Quân viết 01:05 ngày 01/10/2018

Ừ, chỗ đó viết không đủ. Viết vậy dễ bị nhầm giữa trị ‘\0’-0 và ‘0’-48 mặc dù kết quả như nhau. Thế này mới đủ.

str = '\0';
Bài liên quan
0