字符串那点事
来源:互联网 发布:rpc java 编辑:程序博客网 时间:2024/05/01 20:46
读入字符串
cin.getline(char buf[], int bufSize)
回车换行不会读入buf,到缓冲流中也会被去掉。
gets()极容易使得数组越界!
所以最好使用
**char * fgets(char * s, int n,FILE *stream);**
规定了最多读入n-1个字符,不论前面是什么,第n个字符一定会加\0。
特别地! \n也会读入fgets()
在用fgets(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。
example:
char s[100]; //可以。
char *s; //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。
所以,如果要用指针,则 char s=(char )malloc(100*sizeof(char)); 为其分配内存空间fgets(…)读入文本行时的两种情况。
1.如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。并且在s的最后插入字符串结束标志’\0’。
而s缓冲区剩余的位置不会再填充。
example:
123abc
fgets(s,10,fp);
此时,读入七个字符,123abc\n,实际上还有最后的’\0’,所以,strlen(s)=7; 如果要去除末尾的\n,s[strlen(s)-1]=’\0’;便可。
2.如果n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n因为并没有到行尾 ,同样在最后会插入’\0’.
example:
123abc
char s[5];
fgets(s,5,fp);
这时读入4个字符,123a,并没有换行符,所以strlen(s)=4.
\0在计算字符串长度时不算数,但是\n算数!
#include<stdio.h>#include<stdlib.h>int main(){ FILE *fp; fp = fopen("8.txt", "rb"); if(fp == NULL) { printf("failed \n"); exit(0); } char s[2]; int num=0; while((fgets(s,2,fp))!=NULL) { printf(s); num++; } printf("%d", num); fclose(fp); return 0;}
这行代码如果只在8.txt文本中键入123456789那么num的值就是9,就代表读取9次。足以可见fgets确实无论如何都会最后一个装\0
如果在8.txt中键入123456789然后回车,num就等于11 足以证明windows下的回车相当于\r\n!
#include<stdio.h>#include<stdlib.h>int main(){ FILE *fp; fp = fopen("8.txt", "rb"); if(fp == NULL) { printf("failed \n"); exit(0); } char s[15]; fgets(s,6,fp); printf(s); printf("\n"); fgets(s, 14, fp); printf(s); fclose(fp); return 0;}
上面这个程序就为了验证一句话:
若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,
c++:
strupr() 字符转大写
strlowr()字符转小写
\0 的ASCII 为0
一个有关字符串很弱智的写法:
for(int i=0; i<strlen(s); i++)
愚蠢到极点的写法,strlen在每次循环时都要计算一遍,而计算的时间和字符串的长度成正比!
改进:
len = strlen(s); for(int i=0; i<len; i++)
再改进:
for(int i=0; s[i]; i++)
eg:判断某个数组的的某个字符是否到了结尾可以用 if(str[i] == 0) ……
code:
查找子串的函数实现:
int strStr(char s1[], char s2[]){ if(s2[0] == 0)//因为\0的ASCII为0, 所以可以直接这样写! return 0;//判断s2是否为空串, 如果是返回0.另外的写法if(strlen(s2) == 0) for(int i=0; s1[i]; i++) { int j=0, k=i; for(; s2[j]; j++,k++) { if(s2[j] != s1[k]) break; } if(s2[j] == 0) return i;//返回第一次子列出现的位置 } return -1;}
当用一个char *类型的变量,编译器通常会将这个变量放在内存的常量区,字符串的内容不可修改。
如果要修改字符串内容就放在字符数组中,这样才能保证在所以的系统上对其进行修改!
eg: char *sp = "Hello World"; char sa[] = "Hello World";
1.如果要修改数组sa所代表的字符串,只能直接修改元素的单个内容,不可直接对整个修改!
可以 sa[0] = ‘t’ 但是 不可以直接sp = “happy” 这个就是非法的
如果要想整个修改可以使用strcpy函数2.如果要修改指针sp所代表的字符串,可以直接对整个进行操作(相当于修改其指向)但是不可以修改单个元素
可以 sp = “happy”, 不可以 sp[0] = ‘t’;
- 字符串那点事
- 字符串那点事
- 关于connectionstring字符串的那点事
- 关于字符串那点事(一)
- 面试那点事
- 公司那点事
- 编程那点事!!
- 公务员那点事
- 毕业那点事
- JVM 那点事
- C++那点事
- 【粗心】那点事
- 【春运】那点事
- 内存那点事
- 程序员那点事
- Ext那点事
- Ext那点事
- 学习那点事
- Lottie——开启UI动画新时代
- Android面试遇到的问题(2)
- 缓存雪崩,缓存穿透,缓存预热,缓存算法
- (四十三)信号与槽再探
- ROS总结——ROS程序包(一)
- 字符串那点事
- Freeswitch在configure时报错no acceptable C compiler found in $PATH
- 《unix/linux编程实践教程》学习笔记:第四章 文件系统:编写pwd
- [Tkinter 教程03] Button 控件
- Unity 3D游戏开发学习笔记(1) 井字棋
- 机器学习进阶路上不可错过的 28 个视频
- Java内存模型
- 自己编写的一个java简单的窗口实现两点求园面积
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)