01/10/2018, 16:58

Xin nhận xét cách xóa khoảng trắng trong chuỗi

#include <stdio.h>
#include<string.h>
int main ()
{
	char s[50];
	gets(s);
	int n =strlen(s);
	for (int i =0;i<n;i++)
	 if(s[i]=' ')
 	 {
	  for (int j=i;j<n;j++)
	   s[j]=s[j++];
	  n--;  
     }  
	printf("%s",s);
	return 0; 
}
Trần Hoàn viết 19:05 ngày 01/10/2018

Nếu 2 dấu space ở cạnh nhau, nó sẽ bỏ qua dấu đằng sau.
Bạn dùng while thay cho if là được.

rogp10 viết 19:04 ngày 01/10/2018

Như vậy chưa hay cứ ghi đè (bỏ qua khoảng trắng) lên chính nó.

Boy Dốt Toán viết 18:58 ngày 01/10/2018

Mình có cách này:
#Quy ước:

  • s là chuỗi ta đang xử lí
  • len là độ số kí tự có trong chuỗi (không tính kí tự \0)
  • 2 biến chạy i, j

Chúng ta kiểm tra lần lượt các kí tự của chuỗi bằng biến chạy i cụ thể s[i]. Nếu kí tự trong chuỗi hiện tại là s[i] là một kí tự khoảng trắng ' '. Thì chúng ta gán lại các kí tự từ i -> len - 1 bằng các kí tự từ i + 1 -> len (sử dụng biến chạy j). Sau khi xong bước này ta tiếp tục kiểm tra lại kí tự s[i] vì kí tự này sau khi ghi kí tự mới có thể vẫn là một kí tự khoảng trắng (trường hợp 2 khoảng trắng sát nhau). Còn nếu không bạn cho biến chạy tăng lên 1 đơn vị.

viết 18:59 ngày 01/10/2018

if(s[i]=’ ')

== chứ @_@

s[j]=s[j++];

dòng này là undefined behavior…


mỗi lần xóa khoảng trắng ko cần phải dồn toàn bộ chuỗi phía sau lên đâu, ghi đè luôn:

for (char *p_read = s, *p_write = s; *p_read; ++p_read)
    if (!isspace(*p_read)) //isspace trong <ctype.h>
        *p_write = *p_read;

còn nếu chỉ xóa khoảng trắng thừa thì có thể xài 1 biến acceptWhitespace rồi đọc lần lượt từng ký tự, nếu là khoảng trắng và acceptWhitespace == true, hoặc khác khoảng trắng thì ghi vào, ko thì bỏ qua, nếu gặp khoảng trắng thì set biến này thành false, gặp ký tự khác khoảng trắng thì set nó thành true.

int acceptWhitespace = 0; //0 có nghĩa là false
for (char *p_read = s, *p_write = s; *p_read; ++p_read)
{
    if (!isspace(*p_read) || acceptWhitespace) //ký tự khác khoảng trắng hoặc là khoảng trắng và chấp nhận đọc khoảng trắng
        *p_write = *p_read;
    acceptWhitespace = !isspace(*p_read); //chỉ chấp nhận đọc khoảng trắng nếu ký tự liên trước ko phải là khoảng trắng
}
Phạm Trung viết 19:03 ngày 01/10/2018

Mình khắc phục r cảm ơn bạn

aU sUd viết 18:59 ngày 01/10/2018

Thật ra bạn dùng 1 vòng lặp thôi r dùng 1 biến boolean để tracking ký tự trước là đc đấy.
Đầu tiên cho isSpace = false sau đó gặp cứ check nếu gặp khoảng trắng mà boolean true thì continue nếu là chữ khác mà boolean đang true thì set về false lại ^^

Bài liên quan
0