奇怪的输出写入C中的文件

时间:2012-11-18 03:57:48

标签: c file file-io

我正在尝试将字符串附加到文本文件中,但我得到了奇怪的字符。 如果我尝试将结果打印到控制台,则输出是常规的。 这就是我在vim中看到的输出。如果我在gedit中看到它,我会得到奇怪的盒子。

输出文件:

  A^CA^BB^A
  A^CB^BA^A
  B^CA^BA^A

预期产出:

AAB
ABA
BAA

我的函数应该将没有重复的排列写入文本文件。

功能代码:

void RecursivePermute (char *prefix, char *rest, int *ptr)
{
    char *temp = malloc(sizeof(char *));
    char *new_prefix = malloc(sizeof(char *));
    char *rest_left = malloc(sizeof(char *));
    char *rest_right = malloc(sizeof(char *));
    char *new_rest = malloc(sizeof(char *));
    char rest_char;
    int idx = 0;
    int first_occurance = 0;
    int i;
    FILE *file;
    strcpy(temp, rest);
    if (*rest == '\0')
    {
        *ptr += 1;
        printf("Permutation %d: %s\n", *ptr, prefix);
        file = fopen("permutations.txt", "a");
        fprintf(file,"%s\n",prefix);
        fclose(file);
        return;
    }
    else
    {
        size_t rest_size = strlen(rest);
        while (*rest != '\0')
        {

            first_occurance = (strchr(temp, *rest) - temp - idx);
            if (first_occurance == 0)
            {
                rest_char = *rest;
                rest_left = strncpy(rest_left, rest-idx, idx);
                rest_right = strncpy(rest_right, rest+1, rest_size-1);
                sprintf(new_rest, "%s%s", rest_left, rest_right);
                sprintf(new_prefix,"%s%s", prefix, &rest_char);
                RecursivePermute( new_prefix, new_rest, ptr);
            }
            rest++;
            idx ++;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

有一点是你的& rest_char的printf格式说明符是错误的。 & rest_char不能解释为字符串,因为它不是以null结尾的。如果要打印出字符,请使用%c。你的行应该是这样的:

sprintf(new_prefix,"%s%c", prefix, rest_char);

此外,您可能希望查看如何分配字符串。通过指定sizeof(char *)的大小,它将仅创建指针大小的内存分配。如果处于静止状态的字符串大于该字符串,则在执行strcpy时会导致缓冲区溢出。

答案 1 :(得分:0)

当您调用malloc(sizeof(char *))时,您将分配一个四字节的缓冲区(如果您正在编译64位,则分配八个字节)。这几乎肯定不是你想要的。

然后,您使用不检查长度的strcpy()。我几乎从不再使用strcpy()了。

你也使用strncpy()来检查长度,但我讨厌它,因为它并不能保证字符串正确地以空值终止;如果复制长度为4或更长的字符串,并且缓冲区只能容纳4个字符,则不会为空。

所以,我没有在调试器下运行你的程序,但是当你把所有这些问题放在一起时,我并不感到惊讶你的程序行为不端。