Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 5 của 5
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Bài tập mã hóa xâu kí tự gặp lỗi logic lạ

    Mình có làm 1 bài tập mã hóa kí tự kiểu nhảy k bước trong mã ASCII vd "abc xyz" nhảy 2 thì thành "cde zab", những kí tự không phải chữ cái thì giữ nguyên. code mình xong, hoạt động bình thường nhưng có 1 lỗi làm mình thắc mắc.

    Mã:
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    int main() {
    	char s1[200],s2[200];
    	int i,t;
    	printf("nhap xau can ma hoa:
    ");
    	gets(s1);
    	printf("nhap buoc nhay: ");
    	scanf("%d",&t);
    	for (i=0;i<strlen(s1);i++) {
    		if (s1[i]<65||(s1[i]>90&&s1[i]<97)||s1[i]>122) s2[i]=s1[i]; //tuong duong !isalpha(s1[i])
    		else if (s1[i]+t>122||(s1[i]+t>90&&s1[i]<=90)) s2[i]=s1[i]+t%26-26; /eu xoay vong
    		else s2[i]=s1[i]+t%26; /hay t buoc
    	}
    	s2[i];/eu thay s2[i]=0 thi dung
    	printf("chuoi ma hoa:
    \"%s\"",s2);
    	getch();
    	return 0;
    }
    Như mình chú thích trong code, chỗ s2[i]=0 thì code đúng hoàn toàn. nhưng vấn đề là khi không có lệnh đó thì chương trình sẽ gặp lỗi với những đầu vào gồm 8,16,24,32 kí tự (các xâu có độ dài khác vẫn hoạt động bình thường, kể cả độ dài 40 vẫn đúng nhé). VD



    Nguyên nhân có thể là do vấn đề kí tự kết thúc xâu s2[200]. Nếu khởi tạo s2[200]={0} thì code cũng hoàn toàn đúng. Thế nhưng tại sao code lại chỉ sai với những đầu vào như vậy? Mong mọi người giải đáp.

    - - - Nội dung đã được cập nhật ngày 18-05-2014 lúc 09:51 AM - - -

    Tiện đây mình cũng hỏi luôn là khi khởi tạo mảng kí tự (xâu), nếu không khởi tạo giá trị ban đầu thì các phần tử của xâu chứa giá trị null hay giá trị bất kì trong khoảng nào?

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    chuỗi trong C là mảng ký tự kết thúc bằng ký tự '\0', ko phải đơn thuần là mảng ký tự.

    vd "hello" ko phải là mảng {'h', 'e', 'l', 'l', 'o'} mà là mảng {'h', 'e', 'l', 'l', 'o', '\0'}

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nhưng tại sao chỉ với những chuỗi có độ dài 8,16,24,32 mới bị (40 cũng không bị).

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    http://ideone.com/G9vvbs

    chuỗi "hello" 5 chữ thì chương trình cũng có chạy đâu?

    nếu thêm dòng s2[i] = '\0'; thì in ra bthg.


    bạn chạy thử bao nhiêu lần rồi @.@ Hay là bật nhiều chương trình khác lên rồi chạy lại xem sao. Có lẽ là tùy thuộc vào giá trị trên stack mà nó trùng mấy số ngẫu nhiên thôi...




    nhap xau can ma hoa:
    dai hoc bach khoa ha noi
    nhap buoc nhay: 2
    chuoi ma hoa:
    "fck jqe dcej mjqc jc pqk"


    nhap xau can ma hoa:
    12345678
    nhap buoc nhay: 2
    chuoi ma hoa:
    "12345678cÉn╣■⌂"

    hên xui thôi [IMG]images/smilies/online.gif[/IMG] vd ở trên thì ký tự thứ 25 ngẫu nhiên mang giá trị 0, còn ở dưới thì ký tự thứ 9 ngẫu nhiên mang giá trị khác 0 nên nó in ra 1 đống "ký tự" phía sau cho tới tầm ký tự 15 thì có giá trị là 0 nên dừng.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Uhm, mình test lại thì đúng là hên xui thật, do s2[i] nhận giá trị ngẫu nhiên.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •