5

我在一个(ubuntu 精确的)linux 系统上,我想从 C 中的字符串中删除前导字符(制表符)。我认为下面的代码在我以前的安装(ubuntu oneric)上工作,但我现在发现它不起作用不再(请注意,这是通用 UTF-8 字符代码的简化版本):

#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;
}

我愿意

gcc -o removetab removetab.c

执行 removetab 时,我得到

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

注意“=”的重复和缺少的“c”!出了什么问题,或者我该如何实现这一目标。代码应支持 UTF-8 字符串。

4

2 回答 2

8
strcpy(my_char, my_char+1);

strcpy字符串不能重叠。

来自 C 标准(强调我的):

(C99, 7.21.2.3p2) “strcpy 函数将 s2 指向的字符串(包括终止空字符)复制到 s1 指向的数组中。如果复制发生在重叠的对象之间,则行为未定义。

于 2012-05-10T21:28:11.847 回答
3

如果你看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.

该代码在同一个数组上调用strcpy(),这会导致字符串损坏。

于 2012-05-10T21:31:25.183 回答