c,删除包含字符串数字的单词

时间:2014-03-15 20:43:10

标签: c string

我需要删除包含字符串中数字的所有单词。

E.g。如果输入为abdgh 67fgh 32ghj hj dfg43 11 fg,则输出应为abdgh hj fg

我想过使用while( text[i] != ' '),但我不知道如何在字符串的其余部分(第一个空格之后)继续使用它。

我没有任何其他想法,也无法通过Google搜索找到任何内容。拜托,帮助我!

3 个答案:

答案 0 :(得分:0)

在这里,我尝试了一下。对我来说工作得很好。我试图通过评论解释整个代码中的逻辑。希望它有所帮助。

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


int containsNum(char * str);

int main()
{

  char  str[] = "abdgh 67fgh 32ghj hj dfg43 11 fg"; // input string

  char newstr[100] = ""; //new string to create with filtered data

  char * pch; //temp string to use in strtok

  printf("given string : %s\n",str    );

  pch = strtok (str," ");
  while (pch != NULL)
  {
    if(!containsNum(pch))// creation of new string  with strcat
    {                    // if the current word not contains any number
        strcat(newstr,pch);
        strcat(newstr," ");  //adding a space between words for readability
    }
    pch = strtok (NULL, " ");
  }

    printf("modified string : %s\n", newstr );

   return 0;
}
//function containsNum
//gets a string and checks if it has any numbers in it
//returns 1 if so , 0 otherwise
int containsNum(char * str)
{
    int i,
        size =strlen(str),
        flag=0;
    for(i=0; i<size ; ++i)
    {
        if((int)str[i] >=48 && (int)str[i] <=57 ){
           flag =1;
           break;
        }
    }
    return flag;
}

此致

答案 1 :(得分:0)

<强>算法:

1 - 您必须将输入字符串分解为更小的组件,这些组件也称为标记。例如:对于字符串abdgh 67fgh 32ghj hj dfg43 11 fg,令牌可以是abdgh67fgh32ghjhjdfg4311fg

2-这些较小的字符串或标记可以使用定义为
strtok函数形成 char * strtok ( char * str, const char * delimiters );。第一个参数中的str是输入sting,它在下面的代码中是string1。名为delimiters的第二个参数实际上定义了何时将输入字符串分成较小的部分(标记)。 例如,只要遇到whitespacedelimiter作为input就会划分whitespace字符串,这就是字符串在代码中划分的方式。

3 - 因为,您的程序需要删除输入字符串中包含数字的单词,我们可以使用isdigit()函数来检查。

工作代码:

#include <cstring>
#include <ctype.h>
#include<stdio.h>
int main ()
{
 char output[100]=""; 
 int counter;
 int check=0; /* An integer variable which takes the value of "1" whenever a digit 
         is encountered in one of the smaller strings or tokens.
         So, whenever check is 1 for any of the tokens that token is to be ignored, that is, 
         not shown in the output string.*/

 char string1[] = "abdgh 67fgh 32ghj hj dfg43 11 fg";

 char delimiters[] = " ";//A whitespace character functions as a delimiter in the program

 char * token;//Tokens are the sub-strings or the smaller strings which are part of the input string.

 token=strtok(string1,delimiters);/*The first strktok call forms the first token/substring which for the input
                             given would be abdgh*/

 while(token!=NULL)/*For the last substring(token) the strtok function call will return a NULL pointer, which
              also indicates the last of the tokens(substrings) that can be formed for a given input string.
              The while loop finishes when the NULL pointer is encountered.*/

 {
 for(counter=0;counter<=strlen(token)-1;counter++)/*This for loop iterates through each token element. 
                                                  Example: In case of abdgh, it will first check for 'a', 
                                                  then 'b', then 'd' and so on..*/


 {
if(isdigit((int)token[counter])>0)/*This is to check if a digit has been encountered inside a token(substring).
                                  If a digit is encountered we make check equal to 1 and break our loop, as
                                  then that token is to be ignored and there is no real need to iterate
                                  through the rest of the elements of the token*/
    {
    check=1;
    break;
    }
    }
if(check==1)    /* Outside the for loop, if check is equal to one that means we have to ignore that token and
                it is not to be made a part of the output string. So we just concatenate(join) an 
                empty string ( represented by " " )with the output string*/
{
    strcat(output,"");  
    check=0;
}
else            /*If a token does not contain any digit we simply make it a part of the output string
                by concatenating(joining) it with the output string. We also add a space for clarity.*/
{
    strcat(output,token);
    strcat(output," ");
}
   token = strtok( NULL, delimiters ); /*This line of code forms a new token(substring) every time it is executed
                                 inside the while loop*/
}
printf( "Output string  is:: %s\n", output ); //Prints the final result

return 0;
}

答案 2 :(得分:-1)

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>

char *filter(char *str){
    char *p, *r;
    p = r = str;
    while(*r){
        char *prefetch = r;
        bool contain_digit = false;
        while(!isspace(*prefetch) && *prefetch){
            if(contain_digit)
                ++prefetch;
            else if(isdigit(*prefetch++))
                contain_digit = true;
        }
        if(contain_digit){
            r = prefetch;
        }else {
            while(r < prefetch){
                *p++ = *r++;
            }
        }
        if(!*r)
            break;
        if(p[-1] == *r)
            ++r;
        else
            *p++ =*r++;
    }
    *p = '\0';
    return str;
}

int main(void) {
    char text[] = "abdgh 67fgh 32ghj hj dfg43 11 fg";

    printf("%s\n", filter(text));//abdgh hj fg

    return 0;
}