因此,如果我在读取字符串之前扫描了("%c",del),那么它可以正常工作,但是在它没有

时间:2018-05-02 21:06:33

标签: c string scanf

所以我创建了一个从字符串中删除字符的程序,它看起来像这样:

#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输入之前),但如果我这样做它工作得很好。 我不明白为什么。

3 个答案:

答案 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时遇到问题因为,如果您的格式字符串类似于scanf()会使输入缓冲区中的最终\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