从标准输入读取的问题|奇怪的输出

时间:2014-02-22 12:30:33

标签: c arrays string malloc free

我通过重定向(< 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。请在截止日期前帮忙:(

1 个答案:

答案 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);