[英]Strange output writing to file in C
我试图将一个字符串附加到一个文本文件中,但我得到了奇怪的字符。 如果我尝试将结果打印到控制台,则输出是正常的。 这就是我在 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 ++;
}
}
}
一件事是您的 &rest_char 的 printf 格式说明符是错误的。 &rest_char 不能解释为字符串,因为它不是以 null 结尾的。 如果要打印出字符,请使用 %c。 您的行应如下所示:
sprintf(new_prefix,"%s%c", prefix, rest_char);
此外,您可能还想查看一下如何分配字符串。 通过指定 sizeof(char *) 的大小,它只会创建一个指针大小的内存分配。 如果 rest 中的字符串大于该字符串,则在执行 strcpy 时会导致缓冲区溢出。
当您调用malloc(sizeof(char *))
,您将分配一个 4 个字节的缓冲区(如果您正在为 64 位编译,则分配 8 个字节)。 这几乎肯定不是您想要的。
然后,您使用不检查长度的strcpy()
。 我几乎不再使用strcpy()
了。
您还使用strncpy()
,它会检查长度,但我有点讨厌它,因为它不能保证字符串会正确地以空字符结尾; 如果复制长度为 4 或更长的字符串,并且缓冲区只能容纳 4 个字符,则不存在空值。
所以,我没有在调试器下运行你的程序,但是当你把所有这些问题放在一起时,我并不惊讶你的程序行为不端。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.