所以我创建了一个从字符串中删除字符的程序,它看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* deleteChar(char* texto,int n,char del,int i,int j)
{
/*for(i=0,j=0;i<n;i++)
if(texto[i]!=del)
{
texto[j]=texto=i;
j=+1;
}
for(n-i;n-i<n;i--)
texto[n-i]=NULL;
return(texto);*/
if(i!=n)
{
if(texto[i]!=del)
{
texto[j]=texto[i];
j+=1;
}
i+=1;
texto=deleteChar(texto,n,del,i,j);
}
else
{
i=i-j;
for(n-i;n-i<n;i--)
texto[n-i]=NULL;
return(texto);
}
}
void main()
{
char del;
printf("Remover: \n");
scanf("%c",&del);
char* texto;
texto=(char*)calloc(0,sizeof(char));
printf("Texto: \n");
scanf("%s",texto);
int n=0;
n=strlen(texto);
/*char del;
scanf("%c",&del);*/
texto=deleteChar(texto,n,del,0,0);
printf("%s ",texto);
}
关注main()
,出于某种原因,如果我在获取字符串后scanf("%c",&del)
,程序会中断(甚至在获得del
输入之前),但如果我这样做它工作得很好。
我不明白为什么。
答案 0 :(得分:0)
您只为一个Field
char
您需要为整个字符串分配足够的空间,包括NULL终止符,这将使您拥有一个包含20个字符的字符串以及一个NULL终结符
texto = (char*)calloc(0, sizeof(char));
你应该至少控制你可以在texto = (char*)calloc(21, sizeof(char));
中读取字符串的字符数,这样你就不会溢出缓冲区
scanf()
为了更安全,更健壮的用户输入,您应该查找scanf("%20s", texto);
。
答案 1 :(得分:0)
问题是您已重新声明fgets()
在线:
del
所以只需删除char del;
scanf("%c",&del);
的第二次减速。
答案 2 :(得分:0)
读取字符串后读取del
时遇到问题因为,如果您的格式字符串类似于
\n
无法使用>
scanf("%s", stringname);
scanf("%c", charactername);
你可以通过
解决这个问题scanf("%s", stringname);
scanf(" %c", charactername);
在用于阅读字符的%c
中的scanf()
之前添加空格。在读取实际字符之前,这将消耗输入缓冲区中仍留有的任何空格字符。
这是因为%c
不会自动跳过前导空格。
请注意,您只为
的单个字符分配内存char* texto;
texto=(char*)calloc(0,sizeof(char));
而你可以做
char* texto;
texto=calloc(0,sizeof(char)*10);
其中10
是包含\0
字符的字符串的大小。所以你可以在texto
中读取最多9个字符,否则会发生溢出。
为避免溢出,使用scanf()
进行读取时,请使用
scanf("%9s", texto);
您无需在C中显式转换calloc()
的返回值。char *
返回的void *
转换为calloc()
将隐式执行。
要删除你就可以了
char* deleteChar(char* texto,int n,char del,int i,int j)
{
char *ptr=strchr(texto, del);
if(ptr!=NULL)
{
sprintf(texto, "%.*s%s", ptr-texto, ptr+1);
}
}
您不需要返回texto
,因为传递的是数组。
char* deleteChar(char* texto,int n,char del,int i,int j)
{
char *ptr=strchr(texto, del);
if(ptr!=NULL)
{
sprintf(texto, "%.*s%s", ptr-texto, texto, ptr+1);
}
}
strchr()
用于获取字符串中第一次出现的字符。
此外,main()
的返回类型不应为void
。请参阅Return type of main function。