黑马程序员——C语言总结--易犯错误小结
2014-10-14 12:46
190 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
这里面的String s1, s2;翻译过来就是Char * s1, s2;所以s2只是char类型的,并不是char *类型(char*型指针变量)如果写成:
② (*p).成员名 ((*p).num);
③ p -> 成员名 (如 p -> num);
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
1. 不用strcat连接字符串,示例代码:
/* 编写一个函数void strlink(char s[], char t[]) 将字符串t连接到字符串s的尾部 */ #include <stdio.h> void strlink(char s[], char t[]); int main() { char s1[20] = "michael "; char s2[] = "jackson"; strlink(s1, s2); printf("%s\n", s1); return 0; } void strlink(char s[], char t[]) { int i = 0; // 判断s[i]是否为字符串的尾部 while ( s[i] != '\0' ) { i++; } int j = 0; // 拷贝t的内容到s的后面 while ( (s[i] = t[j]) != '\0' ) { i++; j++; } } /* 更加精简的写法,仅作为参考(会有警告信息) void strlink2(char s[], char t[]) { int i = -1; // 判断s[i]是否为字符串的尾部 while (s[++i]) ; int j = 0; // 拷贝t的内容到s的后面 while (s[i++] = t[j++]) ; }*/
2. 不用strcat连接字符串(函数参数为指针变量),示例代码:
/* 编写一个函数void strlink(char *s, char *t) 将字符串t连接到字符串s的尾部 */ #include <stdio.h> void strlink(char *s, char *t); int main() { char s1[20] = "michael "; char s2[] = "jackson"; strlink2(s1, s2); printf("%s\n", s1); return 0; } void strlink(char *s, char *t) { // 判断s[i]是否为字符串的尾部 while ( *s != '\0' ) { s++; } // 拷贝t的内容到s的后面 while ( (*s = *t) != '\0' ) { s++; t++; } } /* 更加精简的写法,仅作为参考(会有警告信息) void strlink2(char *s, char *t) { // 判断s[i]是否为字符串的尾部 while (*s++); // 减回一次 s--; // 拷贝t的内容到s的后面 while ( *s++ = *t++ ) ; }*/
3. 字符串指针,示例代码:
/* 编写一个函数,判断某个字符串是否为回文。 回文就是从左边开始读 和 从右边开始读 都是一样的,比如"abcba" */ #include <string.h> #include <stdio.h> int isHuiwen(char *str); int main() { printf("%d\n", isHuiwen("a")); return 0; } /* 返回1代表是回文 返回0代表不是回文 */ int isHuiwen(char *str) { // 1.定义一个指向变量left指向字符串的首字符 char *left = str; // 2.定义一个指向变量right指向字符串的末字符 char *right = str + strlen(str) - 1; while (left < right) { // 如果左边和右边的字符不一样 if (*left++ != *right--) { return 0; } } return 1; }
4. struct结构体定义变量名易犯错误:
#include <stdio.h> #define String char * int main() { String s1, s2; s1 = "jack"; // s2并不是char *类型,而是char类型 s2 = 'A'; // 只能赋值一个字符 //s2 = "rose"; return 0; }
这里面的String s1, s2;翻译过来就是Char * s1, s2;所以s2只是char类型的,并不是char *类型(char*型指针变量)如果写成:
String s1; String s2; // 这样写就可以了
5. 指向函数的指针易犯错误处:
#include <stdio.h> int sum(int a, int b) { printf("哈哈哈\n"); return a+b; } int main() { int (*p)(int, int); p = sum; // p指向sum函数 int c = (*p)(10, 11); // 利用指针实现函数的掉用和int c = sum((10, 11));等价 printf("和是%d\n", c); return 0; }
6. #ifndef和#endif的配合使用(切记!)
#include <stdio.h> #define PI 3.14 int main() { #ifndef PI printf("没有定义PI这个宏\n"); #else printf("定义了PI这个宏\n"); return 0; #endif }
7. scanf输入普通变量时,要求通知计算机输入变量所在的地址是多少,所有加&符号表示相应变量的地址;而输入字符串时,数组名恰好是字符串的首地址,或者说数组的首地址,所有只需要写数组名即可,不需要加&符号。char *string = "I love China";是把字符串第一个元素的地址赋给字符指针变量string。在用%s输出字符串时候,如:printf("%s\n", string)在输出项中给出字符指针变量名string,系统会输出string所指向的字符串第一个字符,然后自动使string加1,使指向下一个字符,在输出该字符........如此直到遇到字符串结束标志“\0”为止。注意:在内存中,字符串的最后被自动加了一个“\0”,因此在输出时能确定输出的字符到何时结束。
8. 如果p指向一个结构体变量stu,以下3种方法等价:
① stu.成员名(如 stu.num);② (*p).成员名 ((*p).num);
③ p -> 成员名 (如 p -> num);
#include <stdio.h> typedef struct { int age; char *name; } Student; typedef Student * StuP; int main() { Student stu; StuP p = &stu; // p是一个指向结构体变量stu的指针 // 指针变量访问结构体成员用的是->,不是. p->age = 10; // 相当于 (*p).age = 10; //p.age = 10; p->name = "rose"; //p.name = "rose"; return 0; }
相关文章推荐
- 黑马程序员——C语言小结------宏定义以及基本数据类型总结
- 黑马程序员_ios基础总结4_C语言基本语法三
- 黑马程序员_ios基础总结6_C语言基本语法五
- 黑马程序员——C语言之指针常用方法小结
- 黑马程序员之ios学习总结——06 C语言的变量类型和结构体
- 黑马程序员之IOS学习总结——05 C语言中的指针
- 黑马程序员_ios基础总结2_C语言基本语法一
- 黑马程序员-②C语言查漏补缺总结 (下)
- 黑马程序员-c语言学习之数组小结
- 黑马程序员-c语言学习位运算总结
- 黑马程序员-Object-C语言对象与函数参数的总结
- 黑马程序员-我的第二篇学习日记:C语言中的 if 语句总结
- 黑马程序员_C语言01_基础总结
- 黑马程序员_C语言几个不常用的关键字总结
- 黑马程序员-C语言学习之指针总结
- 黑马程序员_ios基础总结5_C语言基本语法四
- 黑马程序员-C语言结构体总结
- 黑马程序员---C语言数据类型总结
- 黑马程序员之IOS学习总结——03C语言中循环结构
- 黑马程序员-①C语言查漏补缺总结(上)