我试图制作一种名为" 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++;
}
}
答案 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;
}