关于字符串(C语言)

在c语言中,有过函数:

scanf("%c",&a);//1
scanf("  %c,&b);//2
scanf("%s",str);//3,str为数组

1从缓冲区读取单个字符,该字符可以是空白字符,回车符,如果是整数(1 2 3…)会将其解释为字符(‘1’,‘2’,‘3’…)。(回车结束)
当用%d或其他格式串读取时,都会跳过空白符。
2在格式控制串%c前面加了空格,则从缓冲区第一个非空白字符开始读取单个字符。(回车结束)
3从缓冲区读取第一个非空白字符开始读取字符串,但是遇到空白符(空格,制表符’\t’,回车换行符)会结束读取,在末尾加上’\0’使其成为字符串。(回车结束)

结束的换行符都会留在缓冲区
测试代码:

#include<stdio.h>

int main()
{
    char a,b,c,d;
    char ar[40];
    int e=100;
    scanf("%c",&a);
    printf("%c\n",a);
    printf("+++++++++++++++\n");
    scanf("%s",ar);
    printf("%s\n",ar);
    printf("++++++++++++++++\n");
    scanf("%c",&b);
    printf("%c\n",b);
    printf("++++++++++++++++\n");
    scanf("%c",&c);
    printf("%c\n",c);
    printf("++++++++++++++++\n");
    scanf("%c",&d);
    printf("%c\n",d);
    printf("++++++++++++++++\n");
    scanf("%d",&e);
    printf("%d\n",e);
}   

结果:

zhanghang@Ubuntu-14:~$ ./a.out   
awasd abcd
a
+++++++++++++++
wasd
++++++++++++++++
 
++++++++++++++++
a
++++++++++++++++
b
++++++++++++++++
100
zhanghang@Ubuntu-14:~$ ./a.out        
wda
w
+++++++++++++++
da
++++++++++++++++


++++++++++++++++



++++++++++++++++



++++++++++++++++

40
40
int getchar(void);
int putchar(int c);
ch=getchar();
对应putchar(ch)打印字符ch

ch=getchar();从缓冲区读取一个字符,该字符可以是任意ASCII码值。类似scanf("%c",&a);多用于字符循环检测和清空缓冲区。

char *gets(char *s);
对应将字符串输出到屏幕函数:
int puts(const char *s);将字符串s输出到屏幕并换行,遇到空字符结束。

从标准输入中读取字符串放到数组s[]中,遇到换行符结束读取并丢弃换行符,加上’\0’字符使其成为字符串,返回数组首地址。该函数有一个最大的缺点:不能控制输入字符串大小。如果输入字符串比原数组大,会导致缓冲区溢出,编译器会抛错:Segmentation fault(程序试图访问未分配内存)。为了保证安全性,现在,这个函数很少用到。

char *fgets(char *s, int size, FILE *stream);
对应将字符串输出到屏幕函数:
int fputs(const char *s, FILE *stream);
将字符串输出到对应流(标准输出,文件等)不会换行。

函数fgets是函数gets的替代品,从文件流(可以是文件指针FILE *fp,标准输入输出流stdin,stdout)中读取字符串放到大小为size的数组s中,并返回数组首地址。
该函数解决了gets()函数对缓冲区溢出的问题。当输入字符串大于数组时,取字符串前size-1个字符放到s[]中并在s[]最后一个空间放置’\0’使其成为字符串;
(如果不放入’\0’字符,不能使用%s格式控制串打印)
该函数同样遇到换行符结束读取,但该函数会将换行符留在数组中。

将换行符留在数组有时会造成很大的不方便,可构造新的函数来消除换行符,代码如下:

char *s_gets(char *st,int n)
{
    char *retval;
    int i=0;
    retval=fgets(st,n,stdin);//调用fgets函数从标准输入读取字符串
    while(retval)
    {
        while(st[i]!='\n'&&st[i]!='\0')//检测st[i]处字符
            i++;
        if(st[i]=='\n')如果先遇到'\n',将其改为'\0'
            st[i]=='\0';
        else         如果遇到的是'\0',清空缓冲区
            while(getchar()!='\n')
                continue;
    }
    return retval;
}
另一个版本
char *s_gets(char *st,int n)
{
    char *retval;
    char *find;
    retval=fgets(st,n,stdin);//调用fgets函数从标准输入读取字符串
    while(retval)
    {
        find=strchr(st,'\n');
        if(find)
            *find='\0';
        else         
            while(getchar()!='\n')
                continue;
    }
    return retval;
}
int fgetc(FILE *stream);
int getc(FILE *stream);

fgetc从任意输入流读取一个字符,而getc是fgetc(stdin)的一个宏定义,只能从标准输入读取单个字符返回其ASCII码。

int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);

在fp所指向的文件中写入一个字符ch,成功返回其ASCII码,否则返回EOF(-1)
两函数功能用法一样。

函数前带有f的一般为文件I/O,而不带f的通常为标准I/O。文件I/O对标准I/O有包含。

扫描二维码关注公众号,回复: 5524344 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_43260665/article/details/86247171