数组为什么要给0值,不然就输出乱码#includestdio.h#includestdlib.hvoid test003(){const char*sint
数组为什么要给0值,不然就输出乱码
#include<stdio.h>
#include<stdlib.h>
void test003()
{
const char*s="int=98;char='a';double=3.14159;";
//char buf[20]; //输出乱码,error
char buf[20]={0}; //ok
sscanf( s, "%*[^']'%c%*s",buf);
printf( "%s\n", buf );
getchar();
}
int main(int argc, char* argv[])
{
test003();
return 0;
}
[解决办法]
C 风格字符串 本质是个字符数组, 使用 '\0' 做字符结束标记
比如 char str[100] = "123";
使用 strlen(str) 测的的字符串长度是 3。
是因为 strlen 函数 测量的时候 看到 '\0' 就知道字符串结束了
[解决办法]
按理sscanf得到的字串后面自己会加'\0'的
这个可能与编译器实现有关
我用VC2010,CB2010都没问题
GCC就有问题了
不过,变量最好还是先初始化下.
[解决办法]
字符串规定一\0做结束符,printf没有遇到\0则认为字符串没有结束,直到把buf完全输出,呃呃呃。。你可以看看内存值,比如你第一个输出a后面烫烫。。。。。。,因为你buf[20]的后面字节数值的cccccc,两个c一起正好的中文的烫
[解决办法]
我再次测试了下
sscanf得到的字串后面不会自动加'\0';
所以buf[20]必须先清0
[解决办法]
[解决办法][解决办法]楼主你这个必须清零,因为你是sscanf一个 %c而不是%s
sscanf( s, "%*[^']'%c%*s",buf);
这buf接的是中间的%c, 最后那个%*s是跳过一个string的意思
buf只接了个%c,当然没有结束符
我不知道楼主的本意,如果你本来就是要接一个字符,那个用个数组干嘛呢
直接这样
char c;
sscanf( s, "%*[^']'%c%*s",&c);
printf( "%c\n", c );
[解决办法]对于sscanf 字串应该是加\0的,不加有点太奇怪了
不知道 keiy 的gcc是怎么回事,我特意试了下我这里的gcc是没问题的
D:\program\test\cpp2>type c.c
#include "stdio.h"
#include "stdlib.h"
#include "memory.h"
int main()
{
int a;
char sz[32];
memset(sz, 0xff, 32); // 故意全部set成非0
sscanf("123abcdef", "%d%s", &a, sz);
printf("%d\n%s\n", a, sz);
return 0;
}
D:\program\test\cpp2>gcc -Wall c.c
D:\program\test\cpp2>a
123
abcdef