Как удалить символ из строки с помощью цикла? - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь заставить программу удалить символ из строки, которую вводит пользователь, но я получаю ошибку внутри цикла.(дополнительный вопрос: добавляет ли символ внутри строки «тот же» код с небольшими изменениями?)

PS Впервые в программировании ...

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Это то, чего вы хотите достичь?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){
    char str[100],c;
    printf("Write text:\n");
    fgets(str,100,stdin);
    printf("Input was: %s\n", str);
    printf("Write a character that should be removed\n");
    c=getchar();
    for(int k=0;k<strlen(str);k++){
        if(str[k]==c){
            for(int j=k;j<strlen(str);j++){
                str[j]=str[j+1];
            }
        }
    }
     printf("String after removing a character = %s", str);
     return 0;
}
0 голосов
/ 17 декабря 2018

Здесь у вас есть две реализации.Оба удаляют все вхождения char ch из строки str

Первый алгоритм работает намного быстрее.Второй медленнее, но легко понять

#include <stdio.h>
#include <string.h>

char *removechar(char *str, int ch)
{
    char *cptr = str, *readptr = str;

    while(*readptr)
    {
        if(*readptr == ch)
        {
            readptr++;
        }
        else
        {
            *cptr++ = *readptr++;
        }
    }
    *cptr = 0;
    return str;
}

char *removechar(char *str, int ch)
{
    char *cpos = str;

    while((cpos = strchr(cpos, ch)))
    {
        strcpy(cpos, cpos + 1);
    }
    return str;
}

int main()
{
    char s[] = "Hello World";

    printf("%s\n", removechar(s, 'd'));
    printf("%s\n", removechar(s, 'l'));

    return 0;
}
0 голосов
/ 17 декабря 2018

Проблемы с вашим кодом:

  1. str[k] != ch было бы допустимым тестом, если бы ch действительно был символом, а не массивом символов длиной 5. Это будетсравните значение символа str[k] с адресом &ch[0].

  2. k < str было бы допустимым сравнением, если бы k был указателем char *, который был инициализирован в &str[0], а не индексом цикла int, начинающимся в 0.

Исправленный код:

int main(void) 
{
    char str[100];
    char ch[5];
    int k, j;

    printf("Write text:\n");
    //getchar();
    fgets(str, 100, stdin);

    printf("Input was: %s\n", str);

    printf("Write a character that should be removed\n");
    //getchar();
    fgets(ch, 5, stdin);

    for (k = 0, j = 0; k < strlen(str); k++)
    {
        if (str[k] != ch[0])
        {
            str[j] = str[k];
            j++;
        }
    }
    str[j] = '\0';
    printf("String after removing a character = %s", str);

    return 0;
}
0 голосов
/ 17 декабря 2018

Это то, что вы пытаетесь достичь?

Изменения:

  • getchar () и fgets () для scanf ()
  • добавлен strlen ()чтобы получить длину строки
  • добавлена ​​длина входной строки в printf
  • добавлено ноль инициализации строк

Примечание: после каждого ввода с помощью scanf () вы должнынажмите ввод.

int main()
{      
    char str[100] = { 0 };
    char ch[5] = { 0 };
    int k, j;

    printf("Write text:\n");
    scanf("%s", str);

    printf("Input was: %s\nLength: %d\n", str, strlen(str));

    printf("Write a character that should be removed\n");
    scanf("%s", ch);

    for (k = 0, j = 0; k < strlen(str); k++)
    {
        if (str[k] != ch[0]) {
            str[j] = str[k];
            j++;
        }
    }
    str[j] = '\0';
    printf("String after removing a character: %s", str);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...