【问题标题】:Two strings input - removing common words from the 1st one and printing it两个字符串输入 - 从第一个字符串中删除常用词并打印它
【发布时间】:2014-04-22 05:51:57
【问题描述】:

这里是这样:我需要从用户那里获取两个字符串,string1 和 string2,然后删除 string1 中的“单词”,它们也存在于 string2 中并打印 string1。

我可以对它们进行标记,但是我没有想法/知识,需要帮助:)

int main()
{
    char string1[100];                  //declaration of array for 1st input
    const char *tokens1[100];           //declaration of array of pointers
    char *token_ptr1;                   //pointer var to store tokens

    char string2[100];                  //declaration of array for 1st input
    const char *tokens2[100];           //declaration of array of pointers
    char *token_ptr2;                   //pointer var to store tokens

    int i=0;


    //input from user:
    printf("Enter string1: ");
    gets(string1);
    printf("\n");
    printf("Enter string2: ");
    gets(string2);

    printf("\n");

    //using strtok function to tokenize string1

    token_ptr1=strtok(string1," ");

    printf("Tokens1: \n");       //loop to store tokens in array of pointers and printing tokens

    while (string1!='\0')
    {
        if (token_ptr1=='\0') {  break;  }
        printf("%s\n",token_ptr1);

        tokens1[i]=token_ptr1;

        token_ptr1=strtok(NULL, " ");

        i++;
    }

    //string1 is tokenized and stored in tokens1


}

在这之后我尝试了各种方法来删除常用词无济于事

编辑:同一个问题中的另一个问题:

示例输入1:这是一个字符串234

-- 示例 INPUT2:234

-- 示例输出:这是一个字符串

使用标记方法将字符串“string234”保存在指针数组中,现在如何处理这个程序?使用简单数组检查单个字符?

【问题讨论】:

    标签: c string tokenize


    【解决方案1】:

    天真的方法是对两个字符串进行标记,然后它们循环遍历来自 string1 的每个标记并与 string2 进行比较。如果令牌匹配,则通过标记将令牌1 删除。

    标记第二个字符串并创建一个数组来标记来自 string1 的每个标记。 如果找到匹配项,则标记 token1 索引,最后仅打印未标记的标记。 我可以使用这样的匹配函数:

    int match(int ind1, int ind2){
        while(string1[ind1]!='0'){
            if (string2[ind2]==string1[ind1]){
                ind2++;
                ind1++;
            }else{
                break;
            }
        }
        // Check if string2 also ended at same position
        if (string1[ind1]==string2[ind2]) return 1;
        return 0;
    }
    

    没有测试过,但我认为它是正确的。 希望能帮助到你!

    【讨论】:

      【解决方案2】:

      我正在考虑你不会更改i,因为它包含令牌的数量。

      strstr(str1,str2),返回指向 str2 中指定的整个字符序列的第一次出现在 str1 中的指针,如果该序列不存在于 str1 中,则返回空指针。

      char * ptr;
      for ( j = 0 ; j < i ; j++){
          ptr = strstr (string2,tokens1[j]);
          if(ptr){
              token1[j] = '\0';
          }
      }
      
      for (j = 0 ; j < i ; j++){
          if(strlen(token1[j]) > 0){
              puts(token1[j]);
          }
      }
      

      希望这会有所帮助.. :)

      注意:我没有编译,只是在这里写了代码。在过去的 1.5 年里,我远离 C 编码。在编程比赛中使用了很多。所以请指出任何错误并让我知道:)

      【讨论】:

        【解决方案3】:

        首先,如果它可以编译的话,你就会得到一个很好的无限循环。您正在将常量字符指针 string1 与字符进行比较,这是毫无意义且错误的。

        while (string1 !≃ '0')
        

        应该是

        while (token_ptr1 != NULL)
        

        然后你也应该跳过下一行。

        如果你不想错过这些,你应该为每个字符串中的最后一个单词做好准备,后跟换行符而不是空格:

        strtok(string1, " \n");
        strtok(NULL, " \n");
        

        为两个循环使用单独的临时 tokenx_ptr 是多余的,您可以在两个循环中使用一个。

        接下来,您需要跟踪在每个字符串中找到了多少个单词。您可以在两个循环之后将i 存储到n1n2,或者将最后一个失败的strtok 中的NULL 值也存储到数组中。我会选择第二种方法。

        然后,打印tokens1 数组中不存在于tokens2 数组中的标记是一个丑陋的 O(n2) 双循环问题。

        int i1 = 0;
        while (tokens1[i1] != NULL) {
            int i2 = 0;
            int found = 0;
            while (tokens[i2] != NULL) {
                if (strncmp(tokens1[i1], tokens2[i2], 100) == 0) {
                    found = 1;
                    break;
                }
                i2++;
            }
            if (!found)
                printf("%s ", tokens1[i1);
            i1++;
        }
        

        【讨论】:

        • 嗨,我是编程新手,可能会犯一些错误,但我喜欢你指出的错误——我喜欢学习。我在这里发布的代码很好地给出了标记化的输出,因为使用 string1!='\0' 作为终止语句的原因是程序在没有这个语句的情况下崩溃。我将处理您的回复和其他人的回复,并将回复。谢谢
        【解决方案4】:
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <ctype.h>
        
        int cmp(const void *a, const void *b){
            return strcmp(*(const char**)a, *(const char**)b);
        }
        
        int main(){
            char string1[100];
            char *token_ptr1;
            char string2[100];
            const char *tokens2[100];
            char *token_ptr2;
        
            char result[100]={0};
            char *wordp, word[100];
            const char *delimiter = " \t\n";
            int i, len, ndw;//Number of delete words
        
            printf("Enter string1: ");
            fgets(string1, sizeof(string1), stdin);//include newline
            //printf("\n");
            printf("\nEnter string2: ");
            fgets(string2, sizeof(string2), stdin);
        
            for(ndw=0, token_ptr2=strtok(string2, delimiter);token_ptr2;token_ptr2=strtok(NULL, delimiter)){
                tokens2[ndw++] = token_ptr2;
            }
            qsort(tokens2, ndw, sizeof(*tokens2), cmp);
        
            token_ptr1 = string1;
            token_ptr2 = result;
            while(*token_ptr1 != '\0'){
                len = strspn(token_ptr1, delimiter);
                strncpy(token_ptr2, token_ptr1, len);//delimiter remain.
                token_ptr1 += len;
                token_ptr2 += len;
                len = strcspn(token_ptr1, delimiter);
                strncpy(word, token_ptr1, len);
                word[len] = '\0';
                wordp = word;
                if(NULL == bsearch(&wordp, tokens2, ndw, sizeof(*tokens2), cmp)){
                    strncpy(token_ptr2, token_ptr1, len);
                    token_ptr2 +=len;
                }
                token_ptr1 += len;
            }
            *token_ptr2 = '\0';
            printf("%s", result);
        
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-11-27
          • 2020-02-28
          • 1970-01-01
          • 1970-01-01
          • 2012-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多