我得到了一个作业,我必须编写一个程序,它将取第一个参数字符串中的字母,并在第二个参数字符串中找到它们,如下所示:
./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的情况下初始化字符串呢?
它可能是显而易见的,但我是新手,所以请帮忙。谢谢!
答案 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;
}