Так что, если я сканируюf ("% c", del), перед чтением строки, это работает, но после этого не - PullRequest
0 голосов
/ 03 мая 2018

Итак, я сделал программу для удаления символа из строки, она выглядит так:

#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 голосов
/ 03 мая 2018

Проблема в том, что вы повторно объявили del в строке:

char del;
scanf("%c",&del);

Так что просто уберите второе замедление del.

0 голосов
/ 03 мая 2018

У вас проблемы с чтением 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. Таким образом, вы можете прочитать максимум 9 символов в texto, иначе произойдет переполнение.

Чтобы избежать переполнения, при чтении с scanf() используйте спецификатор ширины, как в

scanf("%9s", texto);

Вам не нужно явно приводить возвращаемое значение calloc() в C. Преобразование в 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. См. Тип возврата основной функции .

0 голосов
/ 03 мая 2018

Вы выделяете место только для одного char

texto = (char*)calloc(0, sizeof(char));

Вам нужно выделить достаточно места для всей вашей строки, включая терминатор NULL, это позволит вам получить строку из 20 символов плюс терминатор NULL

texto = (char*)calloc(21,  sizeof(char));

И вы должны по крайней мере контролировать, сколько символов вы можете прочитать в вашей строке в scanf(), чтобы вы не могли переполнить свой буфер

scanf("%20s", texto);

Для более безопасного и надежного пользовательского ввода вам следует поискать fgets().

...