两个字符串输入 - 从第一个删除常用字并打印它

时间:2014-04-22 05:51:58

标签: c string tokenize

所以在这里:我需要从用户获得两个字符串,string1和string2,然后删除"单词"在string1中,它也存在于string2和print1中。

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

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


}

在此之后,我尝试了各种方法来删除常见的单词无效

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

示例INPUT1:这是一个string234

- 示例输入2:234

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

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

4 个答案:

答案 0 :(得分:0)

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

标记第二个字符串并创建一个数组以标记来自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;
}

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

答案 1 :(得分:0)

我在考虑你不会改变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编码。在编程竞赛中使用了很多。所以请指出任何错误,让我知道:)。

答案 2 :(得分:0)

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

while (string1 !≃ '0')

应该是

while (token_ptr1 != NULL)

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

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

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

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

接下来,您需要跟踪每个字符串中找到的单词数量。您可以在in1的两个循环之后存储n2,也可以将最后一个失败的NULL的{​​{1}}值存储到数组中。我正在采取第二种方法。

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

tokens2

答案 3 :(得分:0)

#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;
}