#define NULL 0 #include <stdio.h> char *find_char1 (char const *sourse,char const *chars) { char *sou; for (; *chars != '\0'; chars++) { for (sou = sourse; *sou != '\0'; sou++) { if (*sou == *chars) { return sou; } } } return NULL; } int main (void) { char *sourse = "ABCDEFG"; char *chars = "XRCQEF"; printf("%s\n", find_char1(sourse, chars)); return 0; }
guide's answer
#define NULL 0 char *find_char(char const *str, char const *chars) { char *cp; if (str != NULL && chars != NULL) { for ( ; *str != '\0'; str++) { for (cp = chars; *cp != '\0'; cp++) { if (*str == *cp) return str; } } } return NULL; } int main (void) { char *str = "ABCDEFG"; char *chars = "XRCQEF"; printf("%s\n", find_char(str, chars)); return 0; }
#include <stdio.h> #define NUL '\0' char* del_substr (char *str, char const *substr) { char *tempc; char *string = str; while (*str != *substr) { str += 1; if (*str == NUL) return 0; } tempc = str; for ( ; *substr != NUL; substr++) { if (*str != *substr) return 0; str += 1; } while (*str != NUL) { *tempc = *str;//问题在这里,这个赋值不知道为什么出现问题。 str += 1; tempc += 1; } *tempc = NUL; return string; } int main (void) { char sourse[] = "ABCDEFG"; char *chars = "CDE"; printf("%s\n", del_substr(sourse, chars)); return 0; }
我同学也写了一个,因为自己在一开始测试时,写了这么一句
char *sourse = "ABCDEFG";
然后再调用函数,结果出错。原因是用字符串给指针赋值,就相当于在内存内写了一常量,不能再变了。花了一整下午没弄懂,还老错!
同学帮我纠错,也顺便写了一个,比我的好。
#include <stdio.h> #define NUL '\0' #include <string.h> char* del_substr (char *str, char const *substr) { char *string = str; int len = 0; while(*(substr + len) != NUL) len++; int i=0; while(*str!=NUL) { if(*str==*substr) { for(i=0;i<len;i++) { if(*str==NUL) break; if(*str!=*(substr+i)) break; str+=1; } } else str+=1; if(i==len) { while(*str!=NUL) { *(str-len)=*str; str+=1; } *(str-len)='\0'; return string; } } return 0; } int main (void) { char sourse[]="ABCDEFG"; char *chars = "CDE"; printf("%s\n", del_substr(sourse, chars)); return 0; }
答案有bug。
#define NULL 0 #define NUL '\0' #define TRUE 1 #define FALSE 0 #include <stdio.h> char *match (char *str, char const *want) { while (*want != NUL) { if (*str++ != *want++) return NULL; } return str; } char* del_substr(char *str, char const *substr) { char *next; while (*str != NUL) { next = match(str, substr);/*先找第一个相同的字母*/ if (next != NULL) break; str++; } if (*str == NUL) return FALSE; while (*str++ = *next++) ; return str; } int main (void) { char sourse[] = "ABCDEFG"; char const *chars = "CDE"; printf("%s\n", del_substr(sourse, chars)); return 0; }
/*此程序的错误之处在于,i增加时,数组的内容会变化, **例如:i=1,j=4时,即3和9时,arr[4]会变成0;当i=2时, **又会将arr[4]变为1,而应该把那些一开始赋值为0的元素 **给剔除掉。 */ #define MAX 50 int main(void) { int arr[MAX]; int i, j; *arr = 1; *(arr + 1) = 1; for (i = 1; i < MAX; i++) { int a; a = i * 2 + 1; if (arr[i] == 1) { for (j = i + 1; j < MAX; j++) { int b; b = 2 * j + 1; if (b % a == 0) *(arr+j) = 0; else *(arr+j) = 1; } } } int c=0; for (i = 0; i < MAX; i++) { if(arr[i] == 1) c = c + 1; } printf("%d", c); }
注意错误,又纠结了我几个小时…………
这是正确的。
#define MAX 50 int main(void) { int arr[MAX]; int i, j; for (i = 0; i < MAX; i++) { *(arr + i) = 1; } *arr = 1; *(arr + 1) = 1; for (i = 1; i < MAX; i++) { int a; a = i * 2 + 1; if (arr[i] == 1) { for (j = i + 1; j < MAX; j++) { for ( ;*(arr+j) == 0; ) j = j + 1; int b; b = 2 * j + 1; if (b % a == 0) *(arr+j) = 0; else *(arr+j) = 1; } } } int c=0; for (i = 0; i < MAX; i++) { if(arr[i] == 1) c = c + 1; } printf("%d", c); }