字符串那点事

来源:互联网 发布: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’;

0 0
原创粉丝点击