从C中的字符串中删除字符
Remove characters from string in C
我在从字符串中删除字符时遇到问题。我已经能够识别要删除的字符并将它们存储为新字符串,但我想要一个代码,使我能够从原始字符串(我标记为 xxxxxxxx 的位置)中删除新字符串的字符。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char input[120], to_del[120], new_input[120];
int a,b;
void removeString();
int main(void)
{
printf("\nEnter your sentence: ");
gets(input);
printf("\nWhere to start: ");
scanf("%d",&a);
printf("\nHow many characters to delete: ");
scanf("%d",&b);
removeString();
printf("\nNew sentence: %s\n",new_input);
return ;
}
void removeString()
{
memcpy(to_del, &input[a-1], b);
new_input [strlen(input)-b] =xxxxxxxx;
return ;
}
您可以采取以下方法
- 从索引
0
复制到 a-1
的 input
到 new_input
- 从索引
a+b-1
复制到 input
的末尾到 new_input
最后,您的 new_input
将删除位置 a
和 b
之间的所有值。
注:
- 使用
gets()
是危险的。请改用 fgets()
。
- 您不能在 c 中使用
=
分配 字符串。您需要使用 strcpy()
/memcpy()
. 复制字符串 containts
编辑以回应@SouravGhosh 关于重叠字符串的评论。首先,我将字符串复制到 new_input
,然后将右侧部分复制回 input
以覆盖必须删除的部分。
int len = strlen(input);
strcpy(new_input, input);
if (a < len && a+b <= len)
strcpy (input + a, new_input + a + b);
我注意到您的其余代码没有检查任何事情是否正确发生,例如来自 scanf
的 return 值,请注意 gets
是危险的:它是最好将 fgets
与 stdin
.
一起使用
strcpy
指令将字符串的右侧部分复制到要删除的部分。它通过使用指针算法来工作。将 a
添加到 input
与获取 input[a]
的地址相同,即您希望删除开始的位置。 Similary new_input[a+b]
是您希望保留的右手部分的开始。
if
条件的重点是,如果 a
不在字符串中,或者如果您要删除的部分溢出字符串的末尾,则不能完成。
void removeString(void);
int main(void){
printf("\nEnter your sentence: ");
scanf("%119[^\n]%*c", input);
printf("\nWhere to start(1 origin): ");
scanf("%d", &a);
printf("\nHow many characters to delete: ");
scanf("%d", &b);
removeString();
printf("\nOriginal sentence: %s\n", input);
printf("\nNew sentence: %s\n", new_input);
printf("\nLabelled sentence: %s\n", to_del);
return 0;
}
void removeString(void){
strcpy(new_input, input);
memmove(&new_input[a-1], &new_input[a -1 + b], strlen(&new_input[a -1 + b])+1);
strcpy(to_del, input);
memset(&to_del[a-1], 'x', b);
}
我在从字符串中删除字符时遇到问题。我已经能够识别要删除的字符并将它们存储为新字符串,但我想要一个代码,使我能够从原始字符串(我标记为 xxxxxxxx 的位置)中删除新字符串的字符。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char input[120], to_del[120], new_input[120];
int a,b;
void removeString();
int main(void)
{
printf("\nEnter your sentence: ");
gets(input);
printf("\nWhere to start: ");
scanf("%d",&a);
printf("\nHow many characters to delete: ");
scanf("%d",&b);
removeString();
printf("\nNew sentence: %s\n",new_input);
return ;
}
void removeString()
{
memcpy(to_del, &input[a-1], b);
new_input [strlen(input)-b] =xxxxxxxx;
return ;
}
您可以采取以下方法
- 从索引
0
复制到a-1
的input
到new_input
- 从索引
a+b-1
复制到input
的末尾到new_input
最后,您的 new_input
将删除位置 a
和 b
之间的所有值。
注:
- 使用
gets()
是危险的。请改用fgets()
。 - 您不能在 c 中使用
=
分配 字符串。您需要使用strcpy()
/memcpy()
. 复制字符串 containts
编辑以回应@SouravGhosh 关于重叠字符串的评论。首先,我将字符串复制到 new_input
,然后将右侧部分复制回 input
以覆盖必须删除的部分。
int len = strlen(input);
strcpy(new_input, input);
if (a < len && a+b <= len)
strcpy (input + a, new_input + a + b);
我注意到您的其余代码没有检查任何事情是否正确发生,例如来自 scanf
的 return 值,请注意 gets
是危险的:它是最好将 fgets
与 stdin
.
strcpy
指令将字符串的右侧部分复制到要删除的部分。它通过使用指针算法来工作。将 a
添加到 input
与获取 input[a]
的地址相同,即您希望删除开始的位置。 Similary new_input[a+b]
是您希望保留的右手部分的开始。
if
条件的重点是,如果 a
不在字符串中,或者如果您要删除的部分溢出字符串的末尾,则不能完成。
void removeString(void);
int main(void){
printf("\nEnter your sentence: ");
scanf("%119[^\n]%*c", input);
printf("\nWhere to start(1 origin): ");
scanf("%d", &a);
printf("\nHow many characters to delete: ");
scanf("%d", &b);
removeString();
printf("\nOriginal sentence: %s\n", input);
printf("\nNew sentence: %s\n", new_input);
printf("\nLabelled sentence: %s\n", to_del);
return 0;
}
void removeString(void){
strcpy(new_input, input);
memmove(&new_input[a-1], &new_input[a -1 + b], strlen(&new_input[a -1 + b])+1);
strcpy(to_del, input);
memset(&to_del[a-1], 'x', b);
}