C удалить символы из строки - PullRequest
       0

C удалить символы из строки

1 голос
/ 22 октября 2011

У меня есть программа, которая просит ввести строку (mystring) и символ (ch). Затем он удаляет все введенные символы (ch) из строки (mystring). Например, «abcabc» и char «a», тогда результат будет «bcbc». -При использовании scanf программа работает хорошо, если в строке нет пробелов. Если я ввожу «abc abc abc», он читает и обрабатывает только первые 3 буквы (до пробела). Тогда мне посоветовали использовать get (mystr); потому что он может читать все волнение. Но когда я использую получает, результат совпадает с входной строкой, и ничего не происходит.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100

int main(int argc, char *argv[])
{
   char mystr[N] ,result[N];
   char ch;
   int i,k;
   k=0;

   printf("enter string \n");   
   //gets(mystr);///////////////////////////
   //scanf("%s",&mystr);///////////////////
   printf("enter char \n");  
     scanf("%c",&ch);
     scanf("%c",&ch);

  for ( i = 0; i <= strlen(mystr); i++ )
  {
    if (mystr[i] != ch)
    {
      result[k]=mystr[i];
      k++;
    } 
  }
   puts(result);
   system("pause");
   return 0;
}

Ответы [ 4 ]

6 голосов
/ 22 октября 2011
 scanf("%c",&ch);
 scanf("%c",&ch);

Эта секунда scanf ваша проблема. Он выбирает символ новой строки, который вы вводите после буквы, которую хотите удалить (и заменяет предыдущее значение ch).

Избавься от этого.

Обратите внимание, что на странице руководства написано:

Никогда не использовать get () . Потому что невозможно знать, не зная заранее, сколько символы gets () будут читать, а поскольку gets () будет продолжать хранить символы после конца буфер, это крайне опасно для использования. Он был использован для взлома компьютерной безопасности. использование Вместо этого fgets ().

1 голос
/ 22 октября 2011

Вы можете использовать fgets (), как предложено xanatos, с небольшим взломом, чтобы вы могли надежно обрабатывать возвращаемые символы.Просто замените '\ n' на '\ 0' в строке, полученной с помощью fgets.

И в вашей программе вы забыли завершить новую строку символом '\ 0'.Итак, вот код, который вы ищете.

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

#define N 100

int main(int argc,char **argv){

char string[N],str1[N];
char ch;
int i,k = 0;

fgets(string,N,stdin);
string[strlen(string)-1] = '\0';
scanf("%c",&ch);

printf("\n%s , %c",string,ch);
for (i=0;i<=strlen(string);i++)
    if(string[i] != ch)
        str1[k++] = string[i];  

str1[k] = '\0'; 
printf("\n%s , %s\n",string,str1);
return 0;
}
1 голос
/ 22 октября 2011

Используйте это:

char temp[2];
scanf("%1s",temp);
ch = temp[0];

и используйте gets

scanf при использовании с char s имеет некоторые проблемы (он получает "старую" новую строку). Здесь мы немного «обманываем» и используем scanf, чтобы получить строку, которая может иметь до одного символа. Строка из 1 символа явно нуждается во втором символе для терминатора, поэтому массив из 2 символов.

Имейте в виду, что используя scanf для поиска символа, вы не сможете вставить пробел.

Обратите внимание, что gets является "злой" функцией. Используя его, вы можете легко переполнить буфер (он не проверяет, достаточно ли велик буфер). «Правильный» способ сделать это обычно: fgets(mystr, N, stdin); (вариант «file» для gets имеет максимальное количество символов, которое может быть прочитано, и в конце добавляется \0). Обратите внимание, что если вы вставите 150 символов в fgets, 99 перейдет к вашей строке (потому что вы задали максимальный размер 100), будет добавлено 1x \0, а остальные символы останутся в буфере, «готовом» для далее scanf / gets / fgets ... (чтобы проверить его, уменьшите буфер до меньшего значения, например, 5 символов, и проведите несколько тестов)

1 голос
/ 22 октября 2011

хмм - не уверен, в чем проблема - используйте getstr, но не scanf для строки, и у меня это работает в visual studio

int main(int argc, char *argv[])
{
   char mystr[N] ,result[N];
   char ch;
   int i,k;
   k=0;

   printf("enter string \n");   
   gets(mystr);///////////////////////////
   //scanf("%s",&mystr);///////////////////
   printf("enter char \n");  
     scanf("%c",&ch);
    // scanf("%c",&ch);

  for ( i = 0; i <= strlen(mystr); i++ )
  {
    if (mystr[i] != ch)
    {
      result[k]=mystr[i];
      k++;
    } 
  }
   puts(result);
   system("pause");
   return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...