试图"审查"使用指针在C中使用其他方法的所有4个字母单词

时间:2014-11-27 17:02:25

标签: c pointers

我试图制作一种名为" censor"使用我已经制作的2种方法在字符串中找到4个字母的单词,新方法必须使审查员(* start)无效,关于我做错了什么的解释会很棒,谢谢!

void four_stars(char *start){

int count = 0;
int c = 42;
printf("entered\n");
while(count < 4){
    *start = c;
    start++;
    count++;
}

}

char* find_blank(char *start){

char c;
int space = 127;
int null = 0;

while(*start){

    c = *start;
    int asciiVal = c;
    if(asciiVal == 32 || asciiVal == 3){
        return start;
    }
    start++;
}

}

我用来测试它的主要方法是:

int main(){

char myString3[25] = "Test a duck";
printf("The string before: %s\n", myString3);
censor(myString3);
printf("The new string: %s", myString3);
return 0;
}

我拥有的是

void censor(char *start){
char* c = start;
while(*start){
    int i = (int)find_blank(start) - (int)start;
    start = start + i + 1;
    c = start;
    if((int)find_blank(start) - (int)c == 4){
        four_stars(start);

    }
    start++;

}

}

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。学习C时,其中一个挑战是使用指针扫描字符串。随之而来的是学习C库函数可用于在需要时帮助扫描。 (你总是可以单独使用指针来完成它,但是有一些有用的函数可以为你节省大量的比较工作)

扫描4个字母的单词时需要考虑几个复杂的因素。最值得注意的标点符号结束。处理多个可能的单词结尾的一个捷径就是创建一个字符串,其中包含一个字符集合,这些字符可以位于单词的末尾而不是简单的space。然后可以使用C库函数strchr来检查结束字符是否在该集合中。

利用这一点,这里有一个简单的例子,用于扫描字符串中的4个字母的单词,可以帮助您:

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

void censor (char *s)
{
    if (!s) return;                 /* validate s               */

    char *sp = s;                   /* start pointer            */
    char *ep = s;                   /* end pointer              */
    char *termchr = " ,.\n\t\0";    /* str of word ends         */

    while (*ep)                     /* for each char in string  */
    {
        if (strchr (termchr, *ep))  /* if char in termchr       */
        {                           /* and num chars == 4       */
            if (ep - ((sp > s) ? ++sp : sp) == 4) 
            {
                while (sp < ep)     /* replace with '*'         */
                    *sp++ = '*';
            }
            else
                sp = ep;            /* if not, just advance sp  */
        }
        ep++;
    }
}

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

    if (argc < 2) {
        fprintf (stderr, "\n error: insufficient input. Usage:  %s <string>\n\n", argv[0]);
        return 1;
    }

    char *str = strdup (argv[1]);   /* make a copy to prevent clobbering argv[1]    */

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

    censor (str);

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

    return 0;
}

<强>输出:

$ ./bin/censor "A sting that has duck you dude."
  original string: A sting that has duck you dude.
  censored string: A sting **** has **** you ****.

注意: ((sp > s) ? ++sp : sp)是一个简单的测试,如果我在开始时,则在比较之前不要提前sp < / strong>需要因为你已经在一个单词的开头(第一个单词),而不是你找到的最后一个termchr。您可能想要提出一个方案来排除替换中的常用单词,这样您就不会审查像this, that, with, most, good, word(s)这样的单词。那是留给你的。

答案 1 :(得分:0)

#include <stdio.h>

void four_stars(char *start){
    int count = 0;
    int c = '*';
    //printf("entered\n");
    while(count < 4){
        *start = c;
        start++;
        count++;
    }
}

char* find_blank(char *start){
    char c;

    while(*start){
        c = *start;
        if(c == ' ' || c == '\t' || c == '\n'){
            return start;
        }
        start++;
    }
    return start;
}

char* find_not_blank(char *start){
    char c;

    while(*start){
        c = *start;
        if(c != ' ' && c != '\t' && c != '\n'){
            return start;
        }
        start++;
    }
    return NULL;
}

void censor(char *start){
    while(start = find_not_blank(start)){
        int len = find_blank(start) - start;

        if(len == 4){
            four_stars(start);
        }
        start += len;
    }
}

int main(){
    char myString3[25] = "Test a duck";
    printf("The string before: %s\n", myString3);
    censor(myString3);
    printf("The new string: %s", myString3);
    return 0;
}