c中字符串的最小值和最大值

时间:2014-07-02 04:35:21

标签: c

该函数接收单个字符串以及将存储最小值和最大值的地址。例如,当字符串1 + 2 + 3通过时,该函数应该在min和3中包含的地址存储1,并且地址包含最大值。

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

void maxValue(char *s, int *min, int *max);
int main(void)
{
    int i,col, min, max;
    char *text[] = {"1+2+3"};
    col = sizeof(text)/sizeof(text[0]);
    for(i=0; i<col; i++)
    {
        maxValue(text[i], &min, &max);
        printf("min = %d, max = %d", min, max);
    }
}

void maxValue(char *s, int *min, int *max)
{
    int i;
    char* temp = malloc(strlen(s) + 1);
    char* del = "+";
    char* token;
    strcpy(temp, s);
    token = strtok(temp, del);

    int stringInts = atoi(token);
    for(i=0; i<stringInts; i++)
    {
        if(*min < stringInts)
            *min = stringInts;
        if (*max > stringInts) {
            *max = stringInts;
        }
    } 
}

此功能无法正常工作。有人可以指出我做错了吗?

1 个答案:

答案 0 :(得分:3)

您需要在许多地方验证语法和strtok的使用。随着你前进C,每一行,每个角色都很重要。如果你不知道它为什么存在,那么......看看吧......

就是这样,您已经粗略地使用maxValue函数从字符串中提取min和max。你在点击我的时候遇到了挑战并且越过了它以使它发挥作用。虽然有很多方法可以做到这一点,坚持你的方法,这可能是你正在尝试的工作实现:

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

void maxValue(char *s, int *min, int *max);

int main(void)
{
    int min = 0, max = 0;
    char text[] = "1+2+3";

    maxValue (text, &min, &max);
    printf("\nmin = %d, max = %d\n\n", min, max);

    return 0;
}

void maxValue(char *s, int *min, int *max)
{
    char* temp = malloc(strlen(s) + 1);
    char* del = "+";
    int token[3];
    strcpy(temp, s);

    token[0] = atoi (strtok(temp, del));
    token[1] = atoi (strtok(NULL, del));
    token[2] = atoi (strtok(NULL, del));

    int i = 0;
    *min = token[0];
    *max = token[0];
    for(i=0; i<3; i++)
    {
        *max = (*max < token[i]) ? token[i] : *max;
        *min = (*min > token[i]) ? token[i] : *min;
    } 
}

输出:

min = 1, max = 3

每次声明一个变量,初始化它,给它一个值,除非你有充分的理由推迟它。考虑是否需要数组或指向数组的指针。另外,如果你正在处理3个值,你真的需要一个循环吗?所有都是你应该评估和决定的考虑因素。如上所述,这只是一种做你正在尝试的方法。它远非最好的方式,但目的是向您展示您正在做的事情 - 只需要一点点修饰(和语法)就可以了。

要概括maxValue以便它可以处理s中的任意数量的值,您只需要重新编写逻辑。回想一下,上面的例子是为了实现原始代码的建议。您可以消除大部分逻辑,并将其替换为一个简单的while循环,用于检查strtok的返回值以及是否NULL测试最小值/最大值。例如:

void maxValue(char *s, int *min, int *max)
{
    char* temp = malloc(strlen(s) + 1);
    char* del = "+";
    int token;
    char* ptr = NULL;
    strcpy(temp, s);

    token = atoi (strtok(temp, del));
    *min = token;
    *max = token;

    while ((ptr = strtok(NULL, del)) != NULL) 
    {
        token = atoi (ptr);
        *max = (*max < token) ? token : *max;
        *min = (*min > token) ? token : *min;
    } 
}

输入:

char text[] = "1+2+3+4+5+6";

输出:

min = 1, max = 6
相关问题