C从字符串中删除字符

时间:2011-10-22 13:01:04

标签: c string

我有要求输入字符串(mystring)和char(ch)的程序。然后它从字符串(mystring)中删除所有输入的字符(ch)。例如“abcabc”和char'a',那么结果应该是“bcbc”。 - 当我使用scanf时,如果字符串没有空格,程序可以很好地工作。如果我输入“abc abc abc”它只读取并处理前3个字母(直到空格)。 然后我被建议使用gets(mystr);因为它可以读取所有的搅拌。但是当我使用gets时,结果与输入字符串相同,没有任何反应。

#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 个答案:

答案 0 :(得分:6)

 scanf("%c",&ch);
 scanf("%c",&ch);

第二个scanf是你的问题。它正在拾取您要删除的字母后输入的换行符(并覆盖ch的先前值。)

摆脱它。

请注意,正如手册页所示:

  

永远不要使用gets()。因为不知道预先知道数据有多少是不可能的          字符gets()将读取,因为gets()将继续存储字符结束          缓冲区,使用起来非常危险。它已被用来打破计算机安全。使用          相反,fgets()。

答案 1 :(得分:1)

嗯 - 不确定问题是什么 - 使用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;
}

答案 2 :(得分:1)

使用这个:

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

并使用gets

scanfchar一起使用时会出现一些问题(它会获得“旧的”新行)。在这里我们“欺骗”一点,我们使用scanf来获得一个最多可包含一个字符的字符串。一个1个字符的字符串显然需要第二个字符作为终结符,因此是一个包含2个字符的数组。

请注意,使用scanf搜索字符时,您将无法插入空格字符。

请注意gets是一个“邪恶”的功能。您可以使用它轻松地执行缓冲区溢出(它不会检查缓冲区是否足够大)。 “正确”的方式通常是:fgets(mystr, N, stdin);gets的“文件”变体具有可以读取的最大字符数,并且最后会附加\0 )。请注意,如果在fgets中插入150个字符,99将转到您的字符串(因为您提供了100个最大大小),将附加1x \0,其他字符将保留在缓冲区中“准备好“为下一个scanf / gets / fgets ...(测试它,将缓冲区减少到一个较小的值,如5个字符,并做一些测试)

答案 3 :(得分:1)

你可以使用xanatos建议的fgets()和一个小的hack,这样你就可以可靠地处理返回字符。只需将使用fgets获取的字符串中的'\ n'更改为'\ 0'即可。

在你的程序中,你忘了用'\ 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;
}