编程笔记(2)

21.说明一个指针 uint8_t p;
p = &DDRB;
编译提示 警告:assignment discards qualifiers from pointer target type
这是什么类型的警告。
DDRB是一个指向常量的指针

 

22.strcmp("T恤衫", "T恤");返回结果不为零。
strncmp("T恤衫", "T恤",strlen("T恤"));返回结果为零。WHY ?????????????

 

23.出现了这个错误:stray '/161' in program
原来是因为那行出现了全角字符.


24.最近遇到一个奇怪的问题,代码中的中文注释能使程序出错!!!
试看如下的代码:
int main() {
  int a = 0;
  int b = 0;
  /**停车来源字*/
  a = 10;
  b = 20;
  /**注释结束*/
  printf("a=%d/tb=%d", a, b);  
  return 0;
}
运行的结果居然是:a=0 b=0
分析后发现中间的赋值语句被当成了注释,忽略掉了。
请问各位大虾,是否遇到此现象?怎么解释?怎么避免此现象?
编译环境是VC++6.0。
往上人普遍认为是编译器在判断字符编码的时候出错。
有人发现/*和*/之间的字符是奇数就会出错。

 

25.名称:
  sscanf() - 从一个字符串中读进与指定格式相符的数据.
[编辑本段]函数原型:
  Int sscanf( const char *, const char *, ...);
  int scanf( const char *, ...);
[编辑本段]头文件:
  #include<stdio.h>
[编辑本段]说明:
  sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
   第一个参数可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '/t' | '/n' | 非%符号}
  注:
  1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
  2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
  3、width表示读取宽度。
  4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
  5、type :这就很多了,就是%s,%d之类。
  6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
[编辑本段]支持集合操作:
  %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
  %[aB'] 匹配a、B、'中一员,贪婪性
  %[^a] 匹配非a的任意字符,贪婪性
[编辑本段]例子:
  1. 常见用法。
  char buf[512] = ;
  sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123465以%s的形式存入buf中!
  printf("%s/n", buf);
  结果为:123456
  2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
  sscanf("123456 ", "%4s", buf);
  printf("%s/n", buf);
  结果为:1234
  3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
  sscanf("123456 abcdedf", "%[^ ]", buf);
  printf("%s/n", buf);
  结果为:123456
  4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
  sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
  printf("%s/n", buf);
  结果为:123456abcdedf
  5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
  sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
  printf("%s/n", buf);
  结果为:123456abcdedf
  6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
  sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
  printf("%s/n", buf);
  结果为:12DDWDFF
  7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
  sscanf(“hello, world”, "%*s%s", buf);
  printf("%s/n", buf);
  结果为:world
  %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
  如果没有空格则结果为NULL。
  sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.


26.type enum {FALSE = 0, TRUE = 1} BOOL;
这样一行代码编译的时候出现如下错误
error: expected identifier before numeric constant
说的是数字常量前应该有标志符,但是FALSE就是标志符啊。
什么原因呢?
可能是在这行之前有#define FALSE 0
这下明白了吧。
当多人协作,使用其他的库就可能出现这种情况,所以尽量少用宏吧

 

27.QTextCodec

QTextCodec 类提供文本编码之间的转换。
QT使用Unicode来存储,绘制以及操作字符串。在很多情况下,你可能想要使用不同的编码方式来处理数据。例如大部分的日语文件都被存储在Shift-JIS或者 ISO2022的文件中,而俄罗斯的用户常常使用KOI8-R或者CP1251编码方式。QT提供了一个QTextCodec 类集合来从Unicode格式转化到相应的格式。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代码部分

#include <qstring.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qtextcodec.h>

int main()
{  
 QFile file("test.txt");
 if (file.open(IO_ReadOnly|IO_Raw))
 {
  QTextStream floStream(&file);
  QString line;
  QTextCodec *codec=QTextCodec::codecForName("GBK");//////
  floStream.setCodec(codec); ////////////////////////////
  while ( floStream.atEnd()==0 )
  {
   line = codec->fromUnicode(floStream.readLine());///////
   qWarning(line);
  }
  file.close();    
 }
 return 0;
}
代码中的主要改动就是黄底的部分
意思就是创立一个中文GBK编码样式,然后按照这种方式来把读入的文件流进行重新编码,这样中文就可以顺利输出了,不信你可以试一试,哈哈,先介绍这么多,下次有什么下次再写啦。

 

28.今天刚刚装了Qt,并运行了Qt的一个简单的example,然后运行了生成在/debug 文件夹下的 *.exe 文件,但双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。” 这个问题可能是环境变量没设置好,可以通过:我的电脑->属性->高级->环境变量来修改PATH,这样能永久修改PATH。现在我把"C:/Qt/2009.04/mingw/bin;C:/Qt/2009.04/qt/bin"加入到PATH后,可以运行了。

 

下面来看看mingwm10.dll的作用:

MinGW的全称是Minimalistic GNU for Windows,它提供了基于GNU GCC 和其他相关程序( make、autoconf 等等)构造Win32 程序所必需的头文件和库。也许你首先会想到Cygwin。两者都是可以将Unix 下程序在Win32下编译运行的办法。但所不同的是,Cygwin中是将完整的POSIX 系统调用映射到本地API,使用一个模拟POSIX 调用的dll。因此在实际执行时的效率比不上本地编译代码。另外一点:Cygwin的License 是GPL,也就是说你在Cygwin上平台的代码必须开放。(这个是很难让人接受的,仅仅因为移植代码就要开放源码)

而MinGW 与Cygwin的上述两点恰好相反,它将代码编译成Win32 本地代码,使用msvcrt.dll的C运行时库。而且MinGW的其他运行库不以GPL License保护,这也意味着你使用MinGW编译的代码不必公开源码。msvcrt.dll本身是随Win32平台发行的,因此这是一个完全免费的环境。


经搜索:mingwm10.dll是mingw的一个动态链接库,但不是C运行时库.
有-mthreads链接选项则需要这个dll。怎样静态链接进去,还没有发现。

29.使用QFile::readLine()时,发现这函数把每一行最后的换行符也读取了

 

30.qt designer编辑UI界面,若修改右侧的objectname会提示invalid use of undefined type "Ui:MainWindow".解决办法是把objectname改为MainWindow.


 注意,使用objectname右侧的恢复键只能把objectname恢复为mianWindow,而不是MainWindow。

你可能感兴趣的:(编程,正则表达式,dll,qt,Path,Codec)