需要String初始化建议

时间:2014-12-18 11:53:39

标签: c string initialization

我得到了一个作业,我必须编写一个程序,它将取第一个参数字符串中的字母,并在第二个参数字符串中找到它们,如下所示:

./a.out "lolabab" "ablcocllcab"

程序需要打印"loab",因为每个字母只能打印一次。 这是我的计划的主要部分

char    *do_stuff(char *s1, char *s2)
{
    int     i, j, k;
    char    *out;

    out = malloc(sizeof(char) * str_len(s1));
    i = 0;
    j = 0;
    k = 0;
    while (s2[j] != '\0' && s1[i] != '\0')
    {
        if (s2[j] == s1[i])
        {
            if (check_char(out, s1[i]) == 0)
            {
                out[k] = s1[i];
                k++;
            }
            i++;
            j = -1;
        }
        j++;
    }
    return (out);
}

我的问题是:如果我不初始化"out"我有问题。 我现在用malloc初始化它,但我不允许使用malloc :)。 我试过的任何其他方式,似乎对我不起作用(分段错误)。 那么如何在不使用malloc的情况下初始化字符串呢? 它可能是显而易见的,但我是新手,所以请帮忙。谢谢!

3 个答案:

答案 0 :(得分:2)

您始终可以将输出缓冲区作为参数传递

void do_stuff(char *s1, char *s2, char *out /* some large enough char [] */)
{
    int     i, j, k;

    i = 0;
    j = 0;
    k = 0;
    while (s2[j] != '\0' && s1[i] != '\0')
    {
        if (s2[j] == s1[i])
        {
            if (check_char(out, s1[i]) == 0)
            {
                out[k] = s1[i];
                k++;
            }
            i++;
            j = -1;
        }
        j++;

    }
}

和调用函数

char result[SOME_REASONABLE_SIZE] = {0} /* initialize it for the check_char function */;
do_stuff(argv[1], argv[2], result);

你应该检查该功能当然是收到了2个参数。

还有一件事,尽量不在check char函数中使用strlen,将当前字符串长度k传递给它,这样你的程序就会更有效率。

答案 1 :(得分:1)

如果我正确理解了您的需求,则不应创建新字符串,而应使用命令行参数,这些参数在main()的参数中可用。

写作时

int main(int argc, char** argv) {

编译器将安排使argc是命令行参数的数量,argv是带参数的字符串数组。第一个是argv[0],是程序名称,其余是传递给程序的参数。

所以这是完成任务的一种方法(只有高级别的描述 - 其余的是你的!)

取第一个参数argv[1],然后逐个字符循环。对于每个角色,尝试在另一个参数argv[2]中找到它。如果找到它,请打印单个字符。

根本不需要分配内存!

编辑:如果您不想打印双打,那么一种方法是保留一个静态数组,您可以将其用作已打印字符的索引:

static int printed[26] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };

当您打印c时,将其位置设置为1.并且仅在角色的位置为零时打印。

由您决定如何找到任意字符的索引(并决定是否要区分大小写)。

答案 2 :(得分:1)

使用字符数不变(且相对较小)的事实:

#include <limits.h>

#define CHAR_NUM (1<<CHAR_BIT)
#define FLAG(x)  (1<<(x))

void get_common_chars(char* s1,char* s2,char out[CHAR_NUM])
{
    int i,n;
    int flags[CHAR_NUM] = {0};

    for (i=0; s1[i]!=0; i++)
        flags[(unsigned char)s1[i]] |= FLAG(1);

    for (i=0; s2[i]!=0; i++)
        flags[(unsigned char)s2[i]] |= FLAG(2);

    n = 0;
    for (i=0; i<CHAR_NUM; i++)
        if (flags[i] == FLAG(1)|FLAG(2))
            out[n++] = (char)i;
    out[n] = 0;
}

如果您只对非大写字母感兴趣,那么您可以进一步改进它:

#define MIN_CHAR 'a'
#define MAX_CHAR 'z'
#define CHAR_NUM (MAX_CHAR-MIN_CHAR+1)
#define FLAG(x)  (1<<(x))

void get_common_chars(char* s1,char* s2,char out[CHAR_NUM])
{
    int i,n;
    int flags[CHAR_NUM] = {0};

    for (i=0; s1[i]!=0; i++)
        if (MIN_CHAR <= s1[i] && s1[i] <= MAX_CHAR)
            flags[s1[i]-MIN_CHAR] |= FLAG(1);

    for (i=0; s2[i]!=0; i++)
        if (MIN_CHAR <= s2[i] && s2[i] <= MAX_CHAR)
            flags[s2[i]-MIN_CHAR] |= FLAG(1);

    n = 0;
    for (i=0; i<CHAR_NUM; i++)
        if (flags[i] == FLAG(1)|FLAG(2))
            out[n++] = (char)(MIN_CHAR+i);
    out[n] = 0;
}

以下是一个用法示例:

#include <stdio.h>

int main(int argc,char* argv[])
{
    char common_chars[CHAR_NUM];
    if (argc >= 3)
    {
        get_common_chars(argv[1],argv[2],common_chars);
        printf("%s\n",common_chars);
    }
    return 0;
}