字符串的输入/输出

一、用printf函数和puts函数写字符串

  1. (1) 转换说明%s允许printf函数写字符串。
    考虑下面的例子:
    char str[] = “Are we having fun yet?”;
    printf("%s\n",str);
    输出会是:
    Are we having fun yet?
    printf函数会逐个写字符串中的字符,直到遇到空字符才停止。(如果空字符丢失,printf函数会越过字符串的末尾继续写,直到最终在内存的某个地方找到空字符为止。)
  • (2) 如果只想显示字符串的一部分, 可以使用转换说明%.ps,这里p是要显示的字符数量。
    语句:
    printf("%.6s\n",str);
    会显示:
    Are we
    字符串跟数一样, 可以在指定字段内显示。转换说明%ms会在大小为m的字段内显示字符串。(对于超过m个字符的字符串,printf函数会显示出整个字符串,而不会截断。) 如果字符中少于m个字符,则会在字段内右对齐输出。
    如果要强制左对齐,可以在m前加一个减号。
    m值和p值可以组合使用:转换说明%m.ps会使字符串的前p个字符在大小为m的字段内显示。
  1. (1) printf函数不是唯一一个字符串输出函数。C函数库还提供了puts函数,此函数可以按如下方式使用:
    puts(str);
    puts函数只有一个参数,即需要显示的字符串。在写完字符串后,puts函敷总会添加一个额外的换行符,从而前进到下一个输出行的开始处。

二、用scanf和gets函数读字符串

  1. 转换说明%s允许scanf函数把字符串读入字符数组:
    scanf(“is”,str);
    在scanf函数调用中,不需要在str前添加运算符&,因为str是数组名,编译器在把它传递给函数时会把它当作指针来处理。
    调用时,scanf函数会跳过空白字符,然后读入字符并存储到str中,直到遇到空白字符为止。scanf函数始终会在字符串末尾存储一个空字符。
    用scanf函数读入字符串永远不会包含空白字符。因此,scanf函数通常不会读入一整行输入。换行符会使scanf函数停止读入,空格符或制表符也会产生同样的结果。

  2. 为了一次读入一整行输入,可以使用gets函数。类似于scanf函数, gets函数把读入的字符放到数组中,然后存储一个空字符。然而,在其他方面gets函数有些不同于scanf函数。
    1> gets函数不会在开始读字符串之前跳过空白字符(scanf函数会跳过)。
    2> gets函数会持续读入直到找到换行符才停止(scanf函数会在任意空白字符处停止)
    此外,gets函数会忽略掉换行符,不会把它存储到数组中,用空字符代替换行符。

  • 为了领会scanf函数与gets函数之间的差异,考虑下面的程序段:
    char sentence [SENT_LEN+1];
    printf(“Enter a sentence: \n”);
    scanf("%s",sentence);
    假定用户在提示信息
    Enter a sentence:
    的后面输入信息
    To C, or not to C: that is the question.
    1、scanf函数会把字符串“To”存储到sentence中。下一次scanf函数调用将从单词to后面的空格处继续读入这行。
    2、现在假设用gets函数替换scanf函数:
    gets (sentence):
    当用户输入和先前相同的信息时,gets函数会把字符串 To C, or not to C: that is the question. 存储到sentence中。
  1. 注意:在把字符读入数组时,scanf函数gets函数都无法检测数组何时被填满。因此,它们存储字符串时可能会越过数组的边界,这会导致未定义的行为。通过用转换说明%ns代替%s可以使scanf函数更安全。这里的数字n指出可以存储的最多字符数。可惜的是,gets函数天生就是不安全的,fgets函数则是一种好得多的选择。

三、逐个字符读字符串

由上述可知,对许多程序而言,scanf函数和gets函数都有风险且不够灵活。我们可以自己编写输入函数,通过每次一个字符的方式来读入字符串。
函数原型如下:

/***********************************************************
功能:read_line不会跳过空白字符
str表示用来存储输入的数组,
n是读入字符的最大数量,
(如果输入行包含多余n个字符,read_line函数将忽略多余的字符)
read_line函数会返回实际存储在str中的字符数量,
(虽然不总是需要返回值)
************************************************************/

int read_line(char str[], int n)
{
    int ch, i = 0;
    while((ch = getchar()) != '\n')
    {
        if(i<n)
            str[i++] = ch;
        str[i] = '\0';
        return i;
        
    }
}

输出函数:
int sprin

输入函数

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/86535482