C语言中字符串的处理方式(二)
时间:2010-09-03 来源:Robin_TYUT
续前《C语言中字符串的处理方式(一)》
3. 字符串的读写
3.1 用 printf 函数和 puts 函数写字符串
%s 允许 printf 函数写字符串。如:
char str[] = "Are we having fun yet?";
printf("Value of str: %s\n", str);
如果只显示字符串的一部分,可以用 %.ps。这里的 p 是要显示的字符数量。语句
printf("%.6s\n", str);
会显示出
Are we
C函数库还提供puts函数。
puts(str);
3.2 用 scanf 函数和 gets 函数读字符串
在 scanf 函数调用中,不需要在 str 前添加运算符 &。因为 str 是数组名,编译器会自动把它当作指针来处理。调用时,scanf 函数会跳过空白字符,然后读入字符,并且把读入的字符存储到 str 中,知道遇到空白字符为止。scanf 函数始终会在字符串末尾存储一个空字符。用 scanf 函数读入字符串永远不会包含空白字符。因此,scanf 函数通常不会读入一整行输入。换行符会使 scanf 函数停止读入,空格符或制表符也会产生同样的效果。可以参考下面的例子:
#include <stdio.h>
#define STR_LEN 80
int main()
{
char str[STR_LEN + 1];
printf("input a string:");
scanf("%s", str);
printf("String inputed is:%s\n", str);
return 0;
}
运行结果如下:
Input a string:this is a string为了每次读入一整行输入,可以使用 gets 函数。类似于 scanf 函数,gets 函数把读入的字符放到数组中,然后存储一个空字符。然而,在其他方面 gets 函数有些不同于 scanf 函数:
String is:this
(1) gets 函数不会在开始读字符串之前跳过空白字符( scanf 函数会跳过)。
(2) gets 函数会持续读入直到找到换行符才停止(scanf 函数会在任意空白字符处停止)。
此外,gets 函数会忽略掉换行符,而不会把它存储到数组中,用空字符代替换行符。
3.3 逐个字符读字符串
因为 scanf 函数和 gets 函数都有风险且不够灵活,C 程序员经常会编写自己的输入函数。通过每次一个字符的方式来读入字符串。下面是自己编写的读取字符串的函数 read_line():
int read_line(char strp[], int n)返回之前,read_line 函数在字符串的末尾放置了一个空字符。就像 scanf 函数和 gets 函数一样,标准函数会自动在输入字符串的末尾放置一个空字符串。然而,如果自己写输入函数,必须要考虑到这一点。
{
char ch;
int i = 0;
while((ch = getchar()) != '\n')
if(i < n)
str[i++] = ch;
str[i] = '\0'; /* terminates string */
return i; /* number of characters stored */
}
to be continued...