2014-01-10 148 views
-1

我想删除用户在程序中给它的数字的字符,但它会删除下一个字符,这是因为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

您需要使用缩进! – zoska

+0

您的源和目标的strcpy重叠。您的for循环也不会完成任何操作,并且您没有检查用户输入号码的范围。 –

回答

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)); 
} 
+0

这种似乎不是我的答案... – zoska

+0

但是,你仍然没有回答OP的疑问 - 你正在从+ n移动字符串,所以当有人想要删除第一个字符,你会“删除”第2位。 – zoska

+0

flash和memmove的库是什么? –