Đánh giá, nhận xét, review các công ty tuyển dụng
Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 23 kết quả

Đề tài: sử dụng Hàm strcmp() trong lập trình C !!!

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Wink sử dụng Hàm strcmp() trong lập trình C !!!

    Đề bài là nhập 1 từ, in từ, nhập 1 chuỗi bao gồm dấu cách cho đến khi gặp dấu "." thì dừng, in chuỗi, lỗi ở hảm strcmp(), chỉ mình với nha :

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4.  
    5. main()
    6. {
    7.      
    8.       char word[10],string[10];
    9.       int n=0;
    10.      
    11.       printf("\nEnter a word(no space character) : ");
    12.       scanf("%s",word);
    13.       printf("\nThe word is : %s",word);
    14.      
    15.       printf("\nEnter a string(with space character) : ");
    16.      
    17.       do
    18.       {
    19.                       scanf("%c",string[n]);
    20.       }while(strcmp(string[n++],'.'));
    21.      
    22.       printf("\nThe string is : ");
    23.       for(int i=0;i<n;i++)
    24.               printf("%c\t",string[i]);
    25.      
    26.       getch();
    27.  
    28. }

  2. #2
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Bạn có nhiều lỗi hơn mình tưởng đấy, mình đổi tên biến một chút để tránh các từ khoá của C. Cả mình thay cái strcmp rồi, các lỗi mình sửa ở phần đánh dấu.
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    
    main()
    {
         char _word[10],_string[10];
         int n=0;
         printf("\nEnter a word(no space character) : ");
         scanf("%s",&_word);                               ////////
         printf("\nThe word is : %s",_word);
         printf("\nEnter a string(with space character) : ");
         scanf("%c",&_string[n]);   
         do
         {
              n++;
              scanf("%c",&_string[n]);                   ///////////
         } while ( _string[n]!='.');
         _string[n]='\0';                   ///////////////
         printf("\nThe string is : %s",_string); /////////
    getch();
    }

  3. #3
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    QuangHoang ah, giờ vấn đề là thế này :

    1- scanf("%s",_word);---> cái này mình dùng bt mà.
    scanf("%s",&_word);--->thêm "&" vô đó nghĩa là sao? scanf string thi đâu cần "&" đâu ?

    2- scanf("%c",&_string[n]);---> cái này thì đúng rồi, mình viết code lỗi thật .

    3- strcmp , mình đang coi sách đến lệnh này và cố ý dùng lệnh này, strcmp tra về giá trị nguyên, cụ thể là : strcmp(str1,str2);
    . Nhỏ hơn 0 nếu str1 < str2
    . Bằng 0 nếu str1 = str2
    . Lớn hơn 0 nếu str1 > str2

    4-
    .printf("\nThe string is : %s",_string);
    .for(int i=0;i<n;i++)
    printf("%c\t",string[i]);
    2 cái trên giống nhau mà, lệnh của bạn là in ra chuỗi, còn lệnh mình là in từng ký tự, vì vậy nên có vòng for để truy xuất tới từng ký tự của chuỗi. Vậy giải thik dùm mình chỗ này nha

    5- Code của mình và lỗi sau khi sử để tránh từ khóa của C :

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

    main()
    {
    char _word[10],_string[10];
    int n=0;

    printf("\nEnter a word(no space character) : ");
    scanf("%s",_word); //Tới đây bt nè,ko cần dấu &
    printf("\nThe word is : %s",_word);

    printf("\nEnter a string(with space character) : ");
    do
    {
    scanf("%c",_string[n]);
    }while(strcmp(_string[n++],'.')); //Lỗi mình post ở dưới nha

    printf("\nThe string is : ");
    for(int i=0;i<n;i++) //Mình in từng kí tự nên dùng for và %c nha
    printf("%c",_string[i]);

    getch();
    }

    Lỗi :
    18 - invalid conversion from `char' to `const char*'
    18 - initializing argument 1 of `int strcmp(const char*, const char*)'
    18 - invalid conversion from `char' to `const char*'
    18 - initializing argument 2 of `int strcmp(const char*, const char*)'

    Lệnh strcmp dùng biến bình thường nha, ko phải biến con trỏ, phần này sách cũng nói thế. Nếu cần bạn kiểm tra lại giúp, có thể mình nhầm

  4. #4
    Ngày gia nhập
    08 2008
    Nơi ở
    Liên Bang Nga
    Bài viết
    46

    PHP Code:
    1    Mục 1 bạn nói đúnghai câu lệnh scanf("%s",_word);
            
    và scanf("%s",&_word); là tương đương nhaucâu sau thừa dấu không 
    cần thiết
    Vì saoVì _word và &_word đều có chung một giá trịđó chính
    là địa chỉ của _word
    [0]. Chắc các bạn hiểu vì sao!
    2    Mục 2 bạn cũng đúng
    3    Mục 3 bạn đúng
    4    Mục này bạn đúng
    song phương pháp của bạn không tối ưuđể nó chạy
    vòng 
    for thế sẽ ảnh hưởng đến thời gian chạy máysẽ không được đánh giá
    5    Còn các lỗi bạn vẫn còn trong code
    giờ mình sẽ phân tích
        a
    Lỗi đầu tiên,lỗi này rất nguy hiểmNó không báo là do ở chỗ 
    này scanf
    ("%c",_string[n]); Thế nên những người mớilập trình sẽ không
    kiểm soát được việc mình đã nhập được cái gì vào
    việc mình lấy ra được
    cái gì khi nó không trực quan
    Mình phân tích một chút thế nàyCâu lệnh
    scanf
    ("%s",_string); ở trên là đúngvì nó đã truy cập vào được địa chỉ
    của _string
    song _string[nkhông phải là địa chỉ của giá trị mà nó
    quản lý
    nó chỉ đơn thuần là một cái tên để ta nhận diệncòn cái địa chỉ
    mà nó quản lý
    thì ta phải nhờ toán tử mới biết đượccái này do bộ
    nhớ cấp cho nó
    chứ không phải ta cấp cho nó.
    Mình nghĩ là chắc bạn hiểu cấu trúc và nguyên tắc hoạt động của bộ nhớ
    máy tính
    Nếu bạn chưa hiểuthì đọc lạicòn câu này sửa lại thế này
    cho nó đúng scanf
    ("%c",&_string[n]);
        
    b.strcmp(_string[n++],'.'); Đây lại là một lỗi do chưa hiểu bản 
    chất
    Vì sao lại lỗiVì strcmp() là hàm dùng để so sánh hai chuỗiỞ 
    đây bạn đem hai kí tự để so sánh
    thì nó báo lỗi là đúng rồi.
        
    c.Cái tác hại của bạn khi dùng lệnh scanf() để dụng ý đọc một
    chuỗi nhập vào là chỗ nào
    Lệnh scanf() hoạt động thế nàyNó đọc các kí 
    tự nhập vào trên dòng nhập istream
    Nếu gặp space ' ' thì nó bỏ qua,
    cho đến khi gặp kí tự đầu tiên(kí tự nên hiểu là các dấu hiển thị khi
    ta nhập vào từ bàn phím
    Entercác phím chức năng không được hiểu là 
    kí tự
    ). Sau đó nếu gặp tiếp space thì nó kết thúc việc quét kí tự vào
    chuỗi
    Nếu bạn dùng lệnh scanf() để quét chuỗi "Tran Dinh Thang" thì bạn
    chỉ nhận được Tran mà thôi
    Hoặc chuỗi "       Dunglenhscanfkhongdung" 
    thì bạn nhận được nguyên vẹn chuỗi đó.
        
    Bạn có thể sử dụng các hàm khác như gets(), cin.get(); để nhập vào 
    một chuỗi thì hay hơn là dùng lệnh scanf
    ();
        
    Bạn cứ cố gắng sửa bài đicó gì thắc mắcmình sẽ giải thích thêm 
    Tôi thường thích những cái gì mà tôi không bao giờ có được...

  5. #5
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Thx lienthang nha,
    5a - Hỉu rồi, mà thực ra thì bình thường cũng dùng scanf("%c",&_string[n]); hok bít bữa ni sao làm thiếu ko bít
    5b - Ký tự xem như chuỗi thôi mà đâu khác chi đâu, bạn chạy code này thử :

    Code :

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    main()

    {

    char a[2]="a";
    char b[12]="h";
    printf("\nGia tri cua ham strcmp khi so sanh a va b la : %d",strcmp(a,b)); //Trả về giá trị -1 vì a xếp trước h
    getch();

    }

    5c - Mình mới học về lập trình nên còn mấy cái chưa bít , ok rồi sẽ sửa , mà lệnh gets() đọc trong phần Simple string I/O operations, hì tại đọc chưa kĩ , hắn có ghi như thế này : The gets() function replaces the terminating '\n'
    new line character with the '\0' character. Dịch rồi mà chưa hỉu lắm, nếu mình nhập chuỗi có độ dài lớn hơn 1 dòng thì sao? mơ hồ quá.

    ____cin.get trong C++ thì chưa coi đến , code sau khi sửa lỗi :

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

    main()
    {
    char _word[10],_string[10];
    int n=0;

    printf("\nEnter a word(no space character) : ");
    scanf("%s",_word);
    printf("\nThe word is : %s",_word);

    printf("\nEnter a string(with space character) : ");
    do
    {
    scanf("%c",&_string[n]); //Thêm dấu "&"

    } while(strcmp(_string[n],'.')); //ko dùng vòng for để in chuỗi nữa nên ko cần fep toán 1 ngôi "++"

    printf("\nThe string is : %s",_string); //Sửa lại cách in tra chuỗi

    getch();
    }

    Lỗi :
    18 - invalid conversion from `char' to `const char*'
    18 - initializing argument 1 of `int strcmp(const char*, const char*)'
    18 - invalid conversion from `char' to `const char*'
    18 - initializing argument 2 of `int strcmp(const char*, const char*)'

    -Mình có thêm 1 bài gặp lỗi tương tự ở ngoài kia, bài hàm strcpy với strcat, rảnh ghé xem thử, gặp lỗi này ở chương chuỗi hơi nhìu, giúp với ko thì mệt lắm :(

    @lienthang: Vui lòng để code vào tag code. Đọc Nội quy để biết thêm chi tiết
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 13-08-2008 lúc 02:19 AM. Lý do: Nhắc nhở đã được đánh dấu

  6. #6
    Ngày gia nhập
    08 2008
    Nơi ở
    Liên Bang Nga
    Bài viết
    46

    Mặc định sử dụng Hàm strcmp() trong lập trình C !!!

    camping29 thân mến!
    Bạn lại không đúng một lần nữa rồi!
    Vẫn là cái hàm quý báu đó đó. Đúng! Bạn nói đúng! Đoạn code này "char a[2]="a";
    char b[12]="h";
    printf("\nGia tri cua ham strcmp khi so sanh a va b la : %d",strcmp(a,b));" không hề sai, vì sao? Vì a[2] là một mảng(theo ta hiểu là xâu) có độ dài bằng 2. b[12] là mảng có độ dài là 12. Khi so sánh chúng, rõ ràng hàm strcmp() sẽ hiểu, sẽ không báo lỗi.
    Còn trong cái vòng điều kiện của while mà bạn viết, là nó không hiểu được, vì đó là so sánh hai kí tự!
    Bạn nói kí tự coi như chuỗi cũng không đúng nốt. Vì sao? Thì bạn tự tìm hiểu thêm chút là hiểu mà. Trong C không có khái niệm string chuẩn như trong Pascal!
    Sửa lại đoạn trên như sau: while (_string[n]!='.');thì ...chạy bình thường.
    Vui vẻ nhé!
    Tôi thường thích những cái gì mà tôi không bao giờ có được...

  7. #7
    Ngày gia nhập
    08 2008
    Nơi ở
    Liên Bang Nga
    Bài viết
    46

    Mình quên lưu ý bạn mấy điều nữa
    1/ Thứ nhất, trước hàm main(), cũng như một hàm bất kì, bạn phải khai báo kiểu trả về cho nó, tôt nhất là kiểu void, cho nó khỏi phải return.
    2/ Thứ hai là về các hàm trong thư viện string.h

    a. Hàm int strcmp(char *s1, char * s2);
    -Trả về giá trị âm nếu s1<s2(tức là s1[0]<s2[0])
    -Trả về 0 nếu s1=s2
    -Trả về dương nếu s1>s2
    b.Hàm int strcmpi(char *s1, char*s2);
    Tương tự như strcmp() nhưng nó không phân biệt chữ hoa và chữ thường. Tức là strcmp("Abcd","abcdefgh")<0;
    còn int strcmpi("Abcd","abcdefgh")=0;
    c.Hàm int stricmp(char*s1,char*s2);hoạt động y hệt hàm strcmp();
    Tôi thường thích những cái gì mà tôi không bao giờ có được...

  8. #8
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    To lienthang :
    Mình viết Code bằng Dev C++, mà trong đó thì main() must return int( nguyên mẫu ), nhưng nếu ko khai báo kiểu thì nó tự hiểu là int, và tự trả về lun, còn trả về nhiu thì hok bít( chắc là 1).

    -Code đã sửa, chạy bình thường nhưng cho kết quả ko đúng( giải thích ở phần code dưới đây) :

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4.  
    5. main()
    6. {
    7.       char _word[10],_string[10];
    8.       int n=0;
    9.      
    10.       printf("\nEnter a word(no space character) : ");
    11.       scanf("%s",_word);
    12.       printf("\nThe word is : %s",_word);
    13.      
    14.       printf("\nEnter a string(with space character) : ");
    15.       do
    16.       {
    17.                       scanf("%c",&_string[n]);
    18.       }while(_string[n++]!='.');
    19.      
    20.       for(int i=0;i<n;i++)
    21.              printf("%c",_string[i]);    //Bình thường nè
    22.      
    23.       //printf("\nThe string is : %s",_string);  //nếu dùng câu lệnh này thì nó in ra kết quả linh tinh áh
    24.      
    25.              
    26.      
    27.       getch();
    28. }

    -Về lỗi mình hỏi ở trên, sau khi tự xem lại lý thuyết thì đã hỉu: 1 chuỗi kết thúc bằng ký tự NULL '\0', nếu ko có nó thì 1 chuỗi ko đc C hiểu đúng và C ko biết đâu là kết thúc của string, vậy nên in ra ko bình thường
    Đã được chỉnh sửa lần cuối bởi camping29 : 13-08-2008 lúc 10:57 PM. Lý do: Thêm thông tin bài viết

  9. #9
    Ngày gia nhập
    08 2008
    Nơi ở
    Liên Bang Nga
    Bài viết
    46

    Tôi thấy nó chạy rất bình thường mà, chỉ có điều không nên khổ sở viết tắt các câu lệnh quá, viết cho nó rõ ràng ra thế này. Có khi vừa dễ hiểu, vừa ngắn gọn hơn. Cái sai của bạn, là khi khai báo mảng, bạn chưa gán cho nó giá trị bằng '\0', nên nếu dùng lệnh scanf() nó sẽ nhận kí tự space làm dấu hiệu kết thúc và gán _word[lengthof(word)-1]='\0'; Còn khi đi scanf() từng kí tự một scanf("%c",_string[n])thì khi đó thực ra chưa có một dấu hiệu nào báo hiệu là _string đã kết thúc quá trình nhập. Vậy, khi in ra, nó sẽ in đúng cả độ dài khởi tạo ban đầu và giá trị khởi tạo mặc định trong đó. Mà các giá trị khởi tạo đó, có chúa mới biết, ta không biết trước được.
    Bây giờ bạn xem lại đi nhé, có gì không hiểu, lại hỏi tiếp nhé!

    PHP Code:
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>

    void main()
    {
          
    char _word[10],_string[20]="";//Đây này, cần gán cho cái _string của bạn không có gì cả, sau đó mới gán từ từ từng phát một
          
    int n=-1;

          
    printf("\nEnter a word(no space character) : ");
          
    scanf("%s",_word);
          
    printf("\nThe word is : %s",_word);

          
    printf("\nEnter a string(with space character) : ");
          while(
    _string[n]!='.')//Viết thế này có khi còn ngắn hơn vòng do while của bạn
          
    {
                  
    n=n+1;
                  
    scanf("%c",&_string[n]);

          }
    //Nếu ở trên chưa làm phép khởi tạo _string[20]="", thì ở đây phải thêm câu lệnh _string[n+1]='\0' để nó biết rằng phần tử '.' mà bạn nhập vào đã là phần tử gần cuối rồi. Nếu không, nó không biết sẽ phải cần bao nhiêu ngôi nhà cho bao nhiêu người di cư đến, nó cứ chờ mãi mà không chịu thôi đâu
          
    printf("\nThe string is : %s",_string); 
         
    getch();

    Tôi thường thích những cái gì mà tôi không bao giờ có được...

  10. #10
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Uhm, nó chạy bt mừ, ý mình cũng giống như bạn nói đó, mình ko tạo trước hoặc kết thúc nó = '\0' thì nó ko biết đã kết thúc quá trình nhập. Code trên, nếu dùng lệnh printf("\nThe string is : %s",_string); , mình thêm _string[n]='\0', hoặc nếu code của bạn thì thêm_string[n+1]='\0', nó chạy bt.
    Vậy là phần này tạm ổn rồi, bây giờ mình típ tục các phần khác trong C, có ji lập topic hỏi tiếp, giúp đỡ nha .

Các đề tài tương tự

  1. Bài tập C++ vấn đề về con trỏ trong hàm strcmp
    Gửi bởi thienthanoze trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 12
    Bài viết cuối: 19-07-2012, 07:06 PM
  2. Có lỗi đối với hàm Strcmp();
    Gửi bởi luckyfor trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 20-12-2010, 09:51 AM
  3. Hàm strcmp - xem code này.
    Gửi bởi tictic trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 28-04-2010, 11:48 PM
  4. Hàm strcmp có tác dụng gì?
    Gửi bởi linhdong24 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 20-06-2009, 12:48 AM
  5. hỏi về strcmp
    Gửi bởi 7261819 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 20-04-2009, 06:16 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn