Announcement

Collapse
No announcement yet.

[HELP] Bài tập với chuỗi bị lỗi..

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] [HELP] Bài tập với chuỗi bị lỗi..

    Các anh chị giúp em bài này, bà này đơn giản thôi. Chỉ là copy n ký tự của chuỗi st1 qua chuỗi t1. Em cấp phát bộ nhớ động cho chuỗi t1 bằng n nhập vào từ bàn phím nhưng khi kiểm tra strlen(t1) thì lúc nào cũng lớn hơn giá trị n kèm theo đó là các ký tự đặc biệt đi kèm khi khai báo puts(t1).
    Đây là code của em, mong mọi người giải thích.:beatbrick:
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<stdlib.h>
    void copychuoi(char*st1)
    {
    	int n;
    	char *t1;
    	printf("Nhap vi tri n = ");
    	scanf("%d",&n);
    	t1=(char*)malloc(n+1);
    	strncpy(t1,st1,n);
    	puts(t1);
    	printf("%d",strlen(t1));
    	                
    }
    void main()
    {
    	char st1[100];
    	printf("Nhap chuoi st1: ");
    	gets(st1);
    	copychuoi(st1);
    	getch();
    }

  • #2
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<stdlib.h>
    void copychuoi(char*st1, int n)
    {
    
    	char *t1;
    	
    	t1=(char*)malloc(n+1);
    	strncpy(t1,st1,n);
    	puts(t1);
    	printf("%d",strlen(t1));
    	                
    }
    main()
    {
    	int n;
    	char st1[100];
    	printf("Nhap chuoi st1: ");
    	gets(st1);
    	printf("Nhap vi tri n = ");
    	scanf("%d",&n);
    	copychuoi(st1,n);
    	getch();
    }

    Comment


    • #3
      Trước khi gets(st1) thì bạn phải làm hàm fflush(stdin) để xóa bộ đệm của keyboard đã. chỗ đó thì mình nghĩ t1 chỉ cần cấp phát n thôi, cho an toàn thì cập nhật vị trí kết thúc chuỗi tại n. tức là t1[n] = '\0' . các bạn thử lại xem

      Comment


      • #4
        Code:
        #include "stdio.h"
        #include "conio.h"
        #include "string.h"
        #include "stdlib.h"
        
        // Copy the first n characters of the source string
        char *copyString(const char *source,int n)
        {
        	// Get result string's length
        	if (n>strlen(source))
        		n=strlen(source);
        	
        	char *result = (char*)malloc(n+1);			// Allocate memory
        	strncpy(result,source,n);			        // Copy
        	result[n]='\0';						// End string
        	return result;       
        }
        
        void main()
        {
        	char source[100];
        	int n;
        	printf("Nhap chuoi : ");	
        	gets(source);
        	printf("Nhap n : ");		
        	scanf("%d",&n);
        	char * result = copyString(source,n);
        	puts(result);
        	printf("length = %d\n",strlen(result));
        	getch();
        }
        char *strncpy( char *to, const char *from, size_t count )
        Copies at most count characters of from to the string to. If from has less than count characters, the remainder is padded with '\0' characters. The return value is the resulting string.

        Hàm strncpy(...) sao chép count ký tự đầu tiên của chuỗi from vào chuỗi to. Nếu số ký tự của chuỗi from ít hơn số ký tự cần copy, chuỗi to sẽ tự động được kết thúc bằng ký tự '\0' (kết thúc chuỗi). Do đó, khi số ký tự cần copy nhỏ hơn số ký tự chuỗi from, nó chỉ copy đúng count ký tự của chuỗi from, và không tự động thêm ký tự '\0' sau cùng. Chúng ta phải kết thúc chuỗi một cách thủ công.

        Comment


        • #5
          Originally posted by 12520332 View Post
          Các anh chị giúp em bài này, bà này đơn giản thôi. Chỉ là copy n ký tự của chuỗi st1 qua chuỗi t1. Em cấp phát bộ nhớ động cho chuỗi t1 bằng n nhập vào từ bàn phím nhưng khi kiểm tra strlen(t1) thì lúc nào cũng lớn hơn giá trị n kèm theo đó là các ký tự đặc biệt đi kèm khi khai báo puts(t1).
          Đây là code của em, mong mọi người giải thích.:beatbrick:
          Code:
          #include<stdio.h>
          #include<conio.h>
          #include<string.h>
          #include<stdlib.h>
          void copychuoi(char*st1)
          {
              int n;
              char *t1;
              printf("Nhap vi tri n = ");
              scanf("%d",&n);
              t1=(char*)malloc(n+1);
              strncpy(t1,st1,n);
              puts(t1);
              printf("%d",strlen(t1));
                              
          }
          void main()
          {
              char st1[100];
              printf("Nhap chuoi st1: ");
              gets(st1);
              copychuoi(st1);
              getch();
          }
          Hi em. Em đọc thêm về hàm strncpy ở đây nhé: http://www.cplusplus.com/reference/cstring/strncpy/
          Vì chuỗi st1 ban đầu mà em muốn sao chép sang t1 dài hơn số n kí tự mà em muốn sao chép sang, nên chuỗi t1 của em có lẽ không được ngắt đúng lúc (tức nó không chỉ in n kí tự mà em sao ra mà còn thêm mấy cái kí tự đặc biệt nữa).
          Em nhớ lại lúc học, khi khái báo chuỗi kiểu char thông thường, thí dụ như khai báo chuỗi có 5 kí tự, thì nó sẽ dành kí tự cuối cùng để chứa kí tự ngắt NULL '\0'.
          Nói dài dòng thế thôi, em chỉ việc thêm vào sau chỗ em strncpy(...) một phép gán: t1[n]='\0';
          Vì đơn giản là chuỗi trong C là chuỗi "ngắt bởi NULL" (C NULL Terminated). Như vậy khi em in ra nó sẽ ngắt đúng lúc.

          Hi, vừa nhấn nút gửi thì mọi người đã giải đáp hết rồi.
          Thân Lãng Tử Phiêu Du Theo Ngàn Gió,
          Chốn Phiêu Hồng Buông Kiếm Tựa Hồng Nhan

          Đời Đạo Gian

          Comment


          • #6
            Cám ơn mọi người, em làm được rồi.:love:

            Comment

            LHQC

            Collapse
            Working...
            X