我试图做一个方法叫做“”,发现 4 个字母的单词在一个字符串中使用 2 种方法我已经做了,新的方法必须无效(* 开始),解释我做错了将是伟大的,谢谢!
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++;
}
}
#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;
}

有许多方法可以做到这一点。在学习 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;
}
output:
$ ./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)
是一个简单的测试,它说如果我在开头,则在比较之前不要前进1
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(20条)