C语言文件写入乱码

flower31857 2014-09-12 04:44:57
老师让我们写了一个小系统,其中包含用户管理,要记录操作日志,于是我定义了一个log函数,向文件写入了“用户名,操作,时间”,后三个写入正常,但是用户名是乱码,用户名是用户登录函数log_in的返回值,也就是说登陆成功 函数返回用户名,登录失败return 0,我在main函数用了一个字符指针us来接收log_in的返回值,然后作为参数带入log函数,我把log函数贴在下面,求各位帮忙看看,话说我在main函数加了一个printf()函数来观测us,发现是正常的 但是一些如就不正常了,老师用机房tc2.0的分步调试watch我的us变量,她说我的us之邀遇到输出语句值就改变了,她也不明白是怎么回事,我觉得不可思议,希望论坛有人帮我解释一下,先谢过了。
void log(char *u,int i,char*str,char*tm)
{
FILE *fp;
fp=fopen("c:\\TC\\log.txt","a");
if(fp==NULL)
{
fp=fopen("c:\\log.txt","w+");
printf("there is no 'log.txt',now we have creat it there\n");
}
fprintf(fp,"user '%s' have done option %d for string '%s' at %s\n",u,i,str,tm);

fclose(fp);
printf("\n(Finish!And we have recorded your action in 'c:\\tc\\log.txt')\n\n");
}
其中参数u是传入的用户名,i是操作的代号,str是用户处理的字符串,tm是系统时间
...全文
584 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-09-12
  • 打赏
  • 举报
回复
引用 6 楼 flower31857 的回复:
[quote=引用 2 楼 baichi4141 的回复:] 字符串和其他初学者遇到的数据类型最大的不同在于:它只存在于概念中,语言中没有字符串这玩意。你可以称放在一起的一堆字符是一个字符串,并用处理字符串的方式去处理这堆字符,你也可以不这么做。 所以用字符指针来接收一个字符串,和用整型变量来接收一个整数,是完全不同的。一个整型变量是独立的,存在它里面的整数只能通过它来改变。而一个指针指向一块内存,这块内存可能被其他指针指向,可能被其他指针修改,甚至可能根本就不属于你! 简单地说,不要使用指向局部变量的指针,这个变量很可能在进入另一个函数时被改变。 准确的说,你可以使用指向任何地方的指针——只要你真的明白这个指针指向什么地方,其数据由谁修改。
嗯 是这样,子函数临时开辟的内存已经被释放货征用了 那我该怎么实现[/quote] 最简单的办法, 返回一个结构体实例。

typedef struct tagBuf
{
  char buf[32];
}Buf;

Buf log()
{
  Buf buf;
  strncpy(buf,  "hello world", sizeof(buf.buf));
 return buf;
}
baichi4141 2014-09-12
  • 打赏
  • 举报
回复
1 在main函数中定义数组,将其指针传给log_in函数 2 在log_in函数中malloc,在main函数中用完后free 3 把数组封在一个结构体里,结构体可以直接= 方法有很多,问之前先自己想想,比直接问到答案对你更有帮助
flower31857 2014-09-12
  • 打赏
  • 举报
回复
引用 2 楼 baichi4141 的回复:
字符串和其他初学者遇到的数据类型最大的不同在于:它只存在于概念中,语言中没有字符串这玩意。你可以称放在一起的一堆字符是一个字符串,并用处理字符串的方式去处理这堆字符,你也可以不这么做。 所以用字符指针来接收一个字符串,和用整型变量来接收一个整数,是完全不同的。一个整型变量是独立的,存在它里面的整数只能通过它来改变。而一个指针指向一块内存,这块内存可能被其他指针指向,可能被其他指针修改,甚至可能根本就不属于你! 简单地说,不要使用指向局部变量的指针,这个变量很可能在进入另一个函数时被改变。 准确的说,你可以使用指向任何地方的指针——只要你真的明白这个指针指向什么地方,其数据由谁修改。
嗯 是这样,子函数临时开辟的内存已经被释放货征用了 那我该怎么实现
flower31857 2014-09-12
  • 打赏
  • 举报
回复
引用 1 楼 baichi4141 的回复:
我在main函数用了一个字符指针us来接收log_in的返回值 用字符数组 要问原因的话,字符指针指向的十有八九是个局部变量,这个局部变量在log_in函数退出后就不再属于你了,而进入printf函数的时候,这个函数征用了这块内存,结果这块内存的数据就发生了变化——只有属于你的内存的数据由你控制,其他的内存你可以读写,别人也可以 如果你不知道一个指针指向的内存何时属于你何时不属于你,就别用指针
我好像明白是什么意思了 那段内存在子函数结束后就被征用了 那我该怎么解决呢?貌似字符数组是不能直接用=赋值
zilaishuichina 2014-09-12
  • 打赏
  • 举报
回复
目测是 log_in的返回值 lz返回的是一个局部变量 请不要返回一个局部变量的地址
mujiok2003 2014-09-12
  • 打赏
  • 举报
回复
多半返回了栈上变量的指针。
baichi4141 2014-09-12
  • 打赏
  • 举报
回复
字符串和其他初学者遇到的数据类型最大的不同在于:它只存在于概念中,语言中没有字符串这玩意。你可以称放在一起的一堆字符是一个字符串,并用处理字符串的方式去处理这堆字符,你也可以不这么做。 所以用字符指针来接收一个字符串,和用整型变量来接收一个整数,是完全不同的。一个整型变量是独立的,存在它里面的整数只能通过它来改变。而一个指针指向一块内存,这块内存可能被其他指针指向,可能被其他指针修改,甚至可能根本就不属于你! 简单地说,不要使用指向局部变量的指针,这个变量很可能在进入另一个函数时被改变。 准确的说,你可以使用指向任何地方的指针——只要你真的明白这个指针指向什么地方,其数据由谁修改。
baichi4141 2014-09-12
  • 打赏
  • 举报
回复
我在main函数用了一个字符指针us来接收log_in的返回值 用字符数组 要问原因的话,字符指针指向的十有八九是个局部变量,这个局部变量在log_in函数退出后就不再属于你了,而进入printf函数的时候,这个函数征用了这块内存,结果这块内存的数据就发生了变化——只有属于你的内存的数据由你控制,其他的内存你可以读写,别人也可以 如果你不知道一个指针指向的内存何时属于你何时不属于你,就别用指针

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧