删除字符串中的字符

时间:2014-01-10 14:31:34

标签: c

我想删除用户在程序中输入数字的字符,但是删除了下一个字符,这是因为我的代码中计算了0如何更改准确删除用户所需数字的代码?

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

int main(int argc, char *argv[]) {
    char a[30];
    int n,i;
    printf("enter a string\n");
    gets(a);
    printf("enter position you want to delete\n");
    scanf("%d",&n);
    for(i=1;a[i];i++);
    strcpy(&a[n],&a[n+1]);
    printf("the result is:\n");
    puts(a);
    getch();
    return 0;
}

1 个答案:

答案 0 :(得分:4)

您的代码无效,当源和目标缓冲区重叠时,您无法使用strcpy()

您必须使用memmove()来处理这类案件。请注意,memmove()不是字符串函数,因此它不使用0终止,因此您需要传递要移动的字节数。

另外,永远不要使用gets(),这非常危险(没有防止缓冲区溢出的保护)。

您应该执行以下操作:

char a[128];

if(fgets(a, sizeof a, stdin))
{
    const size_t len = strlen(a);
    int n;

    printf("enter index> ");
    flush(stdout);
    if(scanf(" %d", &n) == 1 && n < len)
    {
        memmove(a + n, a + n + 1, len - n);
    }
}

以上使用基于0的索引。如果您想要基于1的索引,请替换最内层的if

if(scanf(" %d", &n) == 1 && n > 0 && n <= len)
{
    --n;
    memmove(a + n, a + n + 1, len - n));
}