字符串的输入、输出

字符串的输入、输出

#include <stdio.h>
#include <string.h>

int split ( char ret[][100], const char str[], const char del );
void lstrip ( char str[], const char del );
void rstrip ( char str[], const char del );
void strip ( char str[], const char del );
int main (void) {
    char ch;
    int i = 0;
    char ret[100][100] = {0};
    char str[100] = {0};
    char del;

    fgets(str,100,stdin);                        
    scanf ("%c",&del);
    split (ret, str,del);
    getchar();

    fgets(str,100,stdin);
    scanf ("%c",&del);
    lstrip (str,del);
    rstrip (str,del);
    getchar();

    fgets(str,100,stdin);
    scanf ("%c",&del);
    strip (str,del);
    return 0;
}

int split(char ret[][100],const char str[], const char del){
    int i = 0, t = 0, s = 0;
    for (t = 0;str[i] != '\0';t++){
        for (s = 0; i < strlen(str); i++) {
            if (str[i] != del&&str[i] != '\n') {
                ret[t][s] = str[i];
                s++;
            }
            else {
                i++;
                break;
            }
        }
        printf("%s\n",ret[t]);
    }
}
void lstrip(char str[], const char del){
    int i, t;
    char copy[100];
    for (i = 0;i < 100; i++) copy[i] = str[i];
    for (i = 0;copy[i] == del;i++);
    for (t = 0;i < 100;i++,t++) {
        str[t] = copy[i];
        if (str[t] == '\n') str[t] = '\0';
    }
    printf("%s\n",str);
}
void rstrip(char str[], const char del){
    int i;
    for (i = strlen(str) - 1; str[i] == del||str[i] == '\n'; i--) {
        str[i] = '\0';
    }
    printf("%s\n",str);
}
void strip(char str[], const char del) {
    int i, t;
    for (i = 0;str[i] == del;i++);
    for (t = 0;i < 100;i++,t++) {
        str[t] = str[i];
        if (str[t] == '\n') str[t] = '\0';
    }
    for (i = strlen(str) - 1; str[i] == del||str[i] == '\n'; i--) {
        str[i] = '\0';
    }
    printf("%s\n",str);
}

这里写图片描述


输入


C库提供的三个读取字符串的函数:scanf、gets、fgets。


gets()(代表get string)函数对于交互式程序非常方便。它从系统的标准输入设备(通常是键盘)获得一个字符串。因为字符串没有预定的长度,所以gets()需要知道输入合适借宿。解决办法是读取字符串知道遇到一个换行符(\n),按回车键可以产生这个字符。它读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符(\0),然后把这个字符串交给调用它的程序。它包括读取换行符并将其丢弃,这样下一次读取就会在新的一行开始。


e.g.

#include <stdio.h>
#define MAX 81
int main (void) {
    char name[MAX];

    printf ( "Hi,what's your name?\n");
    gets (name);
    printf ( "Nice name, %s.\n", name);

    return 0;
    }

gets()的一个不足是它不检查预留存储区是否能够容纳实际输入的数据。多哦出来的字符简单地溢出到相邻的内存区。fgets()函数改进了这个问题,它让你指定最大读入字符数。由于fgets()是为文件I\O而设计的,在处理键盘输入时就不如gets()那么方便。fgets()和gets()有三个方面不同:
1.它需要第三个参数来说明最大字符数。如果这个参数值为n,fgets()就会读取最多n - 1个字符或者读完一个换行符为止,由这二者中最先满足的那个来结束输入。
2.如果fgets()读取到换行符,就会把它存到字符串里,而不是像gets()那样丢弃它。
3.它还需要第三个参数来说明读哪一个文件。从键盘上读取数据时,可以使用stdin(代表standard input)作为该参数,这个标识符在stdio.h中定义。


e.g.

#include <stdio.h>
#define max 81
int main (void) {
    char nmae [MAX];
    char * ptr;

    printf ("Hi,what's your name?\n");
    ptr = fgets (name, MAX, stdin);//括号内的内容分别为:数组名、项目数及stdin标识符
    printf ("%s? Ah! %s!\n", name, ptr);

    return 0;
    }

问题在于fgets()把换行符存储到字符串里,这样每次显示字符串就会显示换行符。(可用strchr()来定位和删除换行符)
由于gets()不检查目标数组是否能够容纳输入,所以很不安全。


scanf ()和gets()的主要区别再由它们如何决定字符串何时结束。scanf()更基于获取单词而不是获取字符串,而gets()会读取所有的字符。
scanf ()有两种方法决定输入结束。无论哪种方法,字符串都是以遇到的第一个非空白字符开始。如果使用%s格式,字符串督导(但不包括)下一个空白字符(比如空格、制表符或换行符)。如果指定了字段宽度,比如%10s,scanf()就会读入10个字符或直到遇到第一个空白字符,由二者中最先满足的哪一个终止输入
【scanf()函数返回一个整数值,这个值是成功读取的项目数;或者当遇到文件结束时返回一个EOF】


输出


C有三个用于输出字符串的标准库函数:puts(),fputs(),printf()。


与printf()不同,puts()显示字符串时自动在其后添加一个换行符。
fputs()函数是gets()的面向文件版本。两者之间的主要区别是:
1.fputs()需要第二个参数来说明要写的文件。可以使用stdout(代表standard output)作为参数来进行输出显示,stdout在stdio.h中定义。
2.与puts()不同,fputs()并不为输出自动添加换行符。


PS:gets()丢掉输入里的换行符,但是puts()为输出添加换行符。另一方面,fgets()存储输入的换行符,而fputs()也部位输出添加换行符。printf()并不自动在新行上输出每一个字符串。


如果不具备或不想使用标准C库的函数进行输入和输出。可以在getchar()和putchar ()的基础上自行定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值