C和指针第六章答案(注意逻辑上的错误)

image_thumb[2]

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

 

image_thumb[8]

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

}
posted @ 2013-03-18 20:42  frechei  阅读(461)  评论(0编辑  收藏  举报