我通过重定向(< filename)从标准输入中获取输入。文件的格式非常简单,如下所示:
>SampleText1
ANYRANDOMLETTERSTILLOFUNKNOWNLENGTH
$
ANYRANDOMLETTERSTILLOFUNKNOWNLENGTH
$$
>SampleText2
ANYRANDOMLETTERSTILLOFUNKNOWNLENGTH
$
ANYRANDOMLETTERSTILLOFUNKNOWNLENGTH
$$
$$$
注意:$$$是文件的结尾。格式> text $> text2 $$重复任意次数
我为此编写的代码如下所示:
scanf("%c", &noise);
char temp[60];
if (noise == '>' || noise == '<')
{
fgets(temp, sizeof(temp), stdin);
}
char xo;
int flag = 0;
while (1)
{
char *str = (char *)malloc(sizeof(char));
while (1)
{
if (fgets(temp, sizeof(temp), stdin) == NULL)
{
flag = 2;
break;
}
else if (temp[0] == '>')
{
flag = 1;
break;
}
else
{
strtok(temp, "\n");
strcat(str, temp);
}
}
char *str1 = strtok(str, "$");
char *str2 = strtok(NULL, "$");
if (!str2)
str2 = "";
puts(str1);
printf("\n \n");
puts(str2);
printf("\n \n");
callAFunction(str1, str2);
// for (i=0; i<strlen(str);i++)
// free(str[i]);
// free(str);
str[0] = '\0';
if (flag == 2)
break;
else
fgets(temp, sizeof(temp), stdin);
}
我的任务是在$和$$之前取两个不同的字符串中的值并将它们传递给一个函数然后继续。我得到了奇怪的输出。我的猜测是问题在于清除str。请在截止日期前帮忙:(
答案 0 :(得分:0)
有一件事需要改变:
char *str = (char *)malloc(sizeof(char));
仅为str
分配一个字节的空间。这将导致您不想要的内存覆盖(例如,来自strcat(str, temp);
根据man strcat
:
strcat()函数将src字符串追加到dest字符串, 覆盖dest末尾的终止空字节('\ 0'),和 然后添加一个终止空字节。字符串可能不重叠,并且 dest字符串必须有足够的空间用于结果。
你想要的东西要比temp
更长,甚至更长(从代码来看)。因此,弄清楚需要多大,并用以下内容替换它:
char *str = malloc(SIZE_I_NEED);