为什么这段代码在linux下会出问题,而在vc里不会?
本帖最后由 K8001 于 2013-06-12 14:20:41 编辑
#include <stdio.h>
#include <string.h>
int main()
{
char str[100]="2013/06/12 09:00,130.131.151.155,username,password";
char dt[10],tm[5],ip[15],name[20],psw[20];
sscanf(str,"%s %[^,],%[^,],%[^,],%s",dt,tm,ip,name,psw);//linux下这句执行完后str第一个字符被改成了\0
printf("%d\n%s\n%s\n%s\n%s\n%s",strlen(str),dt,tm,ip,name,psw);
return 0;
}
Linux下为什么会被改? Linux VC C sscanf
[解决办法]
#include <stdio.h>
#include <string.h>
int main()
{
char str[100]="2013/06/12 09:00,130.131.151.155,username,password";
char dt[11],tm[6],ip[16],name[20],psw[20];
sscanf(str,"%s %[^,],%[^,],%[^,],%s",dt,tm,ip,name,psw);//linux下这句执行完后str第一个字符被改成了\0
printf("%d\n%s\n%s\n%s\n%s\n%s",strlen(str),dt,tm,ip,name,psw);
return 0;
}
[解决办法]
估计和具体实现有关, str 在 dt 的后面,dt 的 '\0' 写入了str[0]
[解决办法]
#include <stdio.h>
#include <string.h>
int main()
{
char str[100]="2013/06/12 09:00,130.131.151.155,username,password";
char dt[11],tm[6],ip[16],name[20],psw[20];
sscanf(str,"%s %[^,],%[^,],%[^,],%s",dt,tm,ip,name,psw);//linux下这句执行完后str第一个字符被改成了\0
printf("%d\n%s\n%s\n%s\n%s\n%s",strlen(str),dt,tm,ip,name,psw);
return 0;
}
能否解释一下为什么接收变量宽度不够会影响到原始字符串?
估计和具体实现有关, str 在 dt 的后面,dt 的 '\0' 写入了str[0]
我把dt的宽度留够(tm、ip不留够)时,为什么str还是被覆盖了?
你设置断点调试,然后把内存窗口打开自己看吧。就知道为什么了。
[解决办法]
每一个都越界
数组大小 10 的会存11个字符
数组大小 05 的会存06个字符
数组大小 15 的会存16个字符
楼主 你~~~~~~ 好萌
[解决办法]
开debugger吧,多半越界,而VC下变量之间有一定的额外的空间,没发作而已。
[解决办法]
#include <stdio.h>
#include <string.h>
int main() {
char str[100]="2013/06/12 09:00,130.131.151.155,username,password";
char dt[11],tm[6],ip[16],name[20],psw[20];
if (5==sscanf(str,"%10s %5[^,],%15[^,],%19[^,],%19s",dt,tm,ip,name,psw)) {
printf("%d\n[%s]\n[%s]\n[%s]\n[%s]\n[%s]\n",strlen(str),dt,tm,ip,name,psw);
} else {
printf("[%s] format error!\n",str);
}
return 0;
}
“多一少一”问题占程序员常犯错误的10%以上!
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。