我想删除用户在程序中输入数字的字符,但是删除了下一个字符,这是因为我的代码中计算了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;
}
答案 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));
}