2012-05-10 35 views
5

Tôi đang sử dụng hệ thống linux (ubuntu chính xác) và tôi muốn xóa ký tự hàng đầu (tabulators) khỏi chuỗi trong C. Tôi cho rằng mã sau đã hoạt động trên cài đặt trước của tôi (ubuntu oneric)) nhưng tôi thấy bây giờ mà nó không hoạt động nữa (lưu ý rằng đây là một phiên bản đơn giản của một mã cho chung UTF-8 ký tự):Xóa ký tự khỏi chuỗi trong tiêu chuẩn C

#include <math.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 

    int nbytes = 10000; 
    char *my_line, *my_char; 

    my_line = (char *)malloc((nbytes + 1)*sizeof(char)); 

    strcpy(my_line,"\tinterface(quiet=true):"); 
    printf("MY_LINE_ORIG=%s\n",my_line); 

    while((my_char=strchr(my_line,9))!=NULL){ 
     strcpy(my_char, my_char+1); 
    } 
    printf("MY_LINE=%s\n",my_line); 

    return 0; 
} 

tôi

gcc -o removetab removetab.c 

Khi thực hiện removetab tôi nhận được

MY_LINE_ORIG= interface(quiet=true): 
MY_LINE=interfae(quiet==true): 

Lưu ý việc xuất bản "=" và thiếu "c"! Có gì sai hoặc làm cách nào tôi có thể đạt được điều này một cách khác. Mã nên hỗ trợ chuỗi UTF-8.

+1

Ngẫu nhiên, bạn đang thực hiện rất nhiều bản sao không có lý do, làm cho thuật toán này giống như O (N!) Cho một thứ có thể là O (N) với thuật toán hợp lý. –

Trả lời

8
strcpy(my_char, my_char+1); 

strcpy chuỗi không được chồng lên nhau.

Từ C Standard (tôi nhấn mạnh):

(C99, 7.21.2.3p2) "Bản sao hàm strcpy chuỗi trỏ đến bởi s2 (bao gồm các ký tự null chấm dứt) vào mảng chỉ vào . bởi s1 Nếu sao chép diễn ra giữa các đối tượng chồng chéo lên nhau, hành vi là undefined "

+0

lạ mà nó hoạt động trước ... – highsciguy

3

Nếu bạn nhìn vào man strcpy:.

DESCRIPTION 
The strcpy() function copies the string pointed to by src, including 
the terminating null byte ('\0'), to the buffer pointed to by dest. 
The strings may not overlap, and the destination string dest must be 
large enough to receive the copy. 

Mã gọi strcpy() trên cùng một mảng dẫn đến tham nhũng chuỗi.

Các vấn đề liên quan