banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Cắt chuỗi trong C++  XML
  [Question]   Cắt chuỗi trong C++ 24/03/2013 03:23:00 (+0700) | #1 | 274334
[Avatar]
hoalong_317
Member

[Minus]    0    [Plus]
Joined: 15/05/2010 06:14:46
Messages: 6
Offline
[Profile] [PM]
mọi người có thể giải thích cho em tại sao trong 2 cách khai báo chuỗi như thế này thì kết quả show ra lại khác nhau như vậy
đoạn code thứ nhất
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
        char str[20];
        char *ptr1,*ptr2;
        printf("nhap chuoi :");
        scanf("%s",str);
        ptr1 = strtok(str," :");
        ptr2 = strtok(NULL," :");
        printf("chuoi thu nhat %s",ptr1);
        printf("chuoi thu hai %s",ptr2);
        getch();
        return 0;
}

đoạn code thứ 2
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
        char str[] = "demo : baitap";
        char *ptr1,*ptr2;
        ptr1 = strtok(str," :");
        ptr2 = strtok(NULL," :");
        printf("chuoi thu nhat %s",ptr1);
        printf("chuoi thu hai %s",ptr2);
        getch();
        return 0;
}

giả sử trong đoạn code 1 ta nhập đầu vào cũng là demo : baitap
khi thực hiện chạy 2 đoạn code này thì đoạn code thứ nhất hiển thị kết quả là demo và null, với đoạn code thứ 2 thì hiển thị ra đúng kết quả mong đợi là demo và baitap
em không chắc lắm về phỏng đoán của mình nhưng theo em nghĩ thì có lẽ cuối chuỗi nhập vào trong đoạn code thứ nhất có cái gì đó không ổn (có thể là chứ một kí tự lạ nào đó nhưng cũng không phải bởi vì em đã đếm số kí tự và thiết lập số phần tử bằng đúng với chiều dài của chuỗi, cũng có thể là không có \0 nhưng theo lý thuyết thì một chuỗi luôn có \0 đằng sau để đánh dấu kết thúc chuỗi)
Học để nghiên cứu, làm việc để nghiên cứu
[Up] [Print Copy]
  [Question]   Cắt chuỗi trong C++ 24/03/2013 09:14:05 (+0700) | #2 | 274336
acenux
Member

[Minus]    0    [Plus]
Joined: 26/02/2012 19:52:32
Messages: 12
Offline
[Profile] [PM]
Đoạn code đầu tiên dùng scanf("%s", str) nhưng "%s" chỉ đọc đến lúc gặp khoảng trắng là dừng nên chuỗi nhập vào thay vì là "demo : baitap" thì nó chỉ nhận có "demo" mà thôi, vì vậy mới ra null sau khi cắt chuỗi.

Cách nhanh nhất để sửa là thay "%s" bằng "%[^\n]" , như vậy nó sẽ đọc đến khi có xuống dòng, lúc bạn nhấn enter.
[Up] [Print Copy]
  [Question]   Cắt chuỗi trong C++ 24/03/2013 16:10:13 (+0700) | #3 | 274348
[Avatar]
hoalong_317
Member

[Minus]    0    [Plus]
Joined: 15/05/2010 06:14:46
Messages: 6
Offline
[Profile] [PM]
đúng là như thế thật, %s sẽ đọc các kí tự cho đến khi gặp khoảng trắng hoặc \n, cảm ơn bạn
Học để nghiên cứu, làm việc để nghiên cứu
[Up] [Print Copy]
  [Question]   Cắt chuỗi trong C++ 24/03/2013 23:02:46 (+0700) | #4 | 274366
[Avatar]
Hatake_Kakashi
Member

[Minus]    0    [Plus]
Joined: 01/08/2012 21:37:08
Messages: 10
Offline
[Profile] [PM]
cảm ơn acenux. Bạn tuyệt vời lắm!
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|