首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

为什么这段代码在linux下会出有关问题,而在vc里不会

2013-06-25 
为什么这段代码在linux下会出问题,而在vc里不会?本帖最后由 K8001 于 2013-06-12 14:20:41 编辑#include

为什么这段代码在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;

}

[解决办法]
引用:
Quote: 引用:


#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]
[解决办法]
引用:
Quote: 引用:

Quote: 引用:


Quote: 引用:


#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的返回值。

热点排行