2012-11-18 41 views
-1

我想追加一个字符串到文本文件,但我变得奇怪的字符。 如果我尝试将我的结果打印到控制台,则输出是常规的。 这就是我在vim中看到的输出。如果我在gedit中查看它,我会得到奇怪的盒子。奇怪的输出写入文件在C

输出文件:

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 ++; 
     } 
    } 
} 
+0

如果您还显示对该函数的调用,显示您传递的参数并显示结果将会很有帮助。 – steveha

+0

@steveha我正在用RecursivePermute(“”,letters,&count)调用函数; //其中count = 0;和字母[] =“AAB”; – Miles

回答

0

的一件事是你的printf格式说明符& rest_char是错误的。 & rest_char不能被解释为一个字符串,因为它不是空终止的。如果你想打印出一个字符使用%c。你的线应该看起来像这样:

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

你也可能想看看你是如何分配字符串。通过指定sizeof(char *)的大小,它只会创建一个指针大小的内存分配。如果静止字符串大于该值,则在执行strcpy时会导致缓冲区溢出。

+0

是的,解决了我遇到的问题。我也会试图找出sizeof(char *)和strcpy所带来的问题。 – Miles

+2

如果你知道你的字符串不会超过一定的长度,只需将它们声明为一个数组char temp [120],然后使用strncpy(temp,rest,120); –

+0

@NathanMoinvaziri,像这样使用'strncpy'并不危险。我们必须时刻注意为额外的空字符留出空间。一个安全的方法是使用'strncpy(temp,rest,119); temp [119] ='\ 0';'。 –

0

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

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

你也使用strncpy(),它会检查长度,但我有点讨厌它,因为它不能保证字符串将正确地以null结尾;如果复制长度为4或更长的字符串,并且缓冲区只能保存4个字符,则不存在空值。

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

+0

他用malloc分配的内存被泄漏。此代码只是...灾难 –

+0

@stevenha感谢您的意见我非常感谢。你的权利我想我应该使用sizeof(char)来代替。我也将看看strncpy()。 At => Nik B你能否向我解释当你说我的malloc分配被泄漏时你的意思? – Miles

+0

'sizeof(char)'是1.除非你的字符串长度为1,否则你不需要这个。如果你所能拥有的最长的字符串是120个字符,你可以尝试'malloc(121)'(不要忘记你需要为每个字符分配空间加上终止的ASCII 0“空”字符)。他的分配意味着什么泄漏了:你用'malloc()'分配内存,但是你永远不会在内存中调用'free()'。对于这样的玩具程序,没关系,因为程序结束时会返回内存。但是,当你完成mem时,习惯于调用'free()'并不是一个坏主意。 – steveha