若需把一个字符串读到程序中,首先预留存储字符串的空间,然后使用输入函数获取该字符串
计算机不会先计算字符串长度,然后再为字符串分配空间
如果使用代码:
char *str;
scanf("%s", str);
则在读入str的时候,str会覆盖程序中的已有数据和代码,可能导致程序异常终止,因为在获取字符串之前,虽然进行了声明,但是并没有初始化为其分配存储空间,str可能指向任何可能的位置
最简单的方法是在声明的同时明确指出数组的大小:
char str[80];
另一种方法是使用C库中分配存储空间的函数
为字符串预留空间之后,可以读取字符串,C库提供了3个读取字符串的函数:scanf()、gets()、fgets()
gets()函数:get string,从系统的标准输入设备(通常是键盘)获得一个字符串
因为字符串没有预定的长度,所以gets()函数需要知道何时结束读取
解决办法:读字符串直到遇到一个换行字符(\n),按回车键可以产生该字符
gets()函数读取换行字符之前(不包括换行字符)的所有字符,并在这些字符后添加一个空字符(\0),然后把这个字符串交给调用它的程序
gets()函数将读取换行字符并将其丢弃,保证下次读取会在新的一行开始
示例代码:
#include int main(void)
{char name[100]; // 分配空间printf("I need a name:\n");gets(name); // 使用gets()函数从键盘获得字符串printf("%s is a nice name.\n", name); // 显示,确认读取数据return 0;
}
运行结果:
gets()函数通过两种方式获得输入:
1)使用一个地址把字符串赋予数组
2)使用return关键字返回字符串地址
/* 将gets()函数的返回值分配给指针 */
#include int main(void)
{char name[100]; // 分配空间char * p;printf("I need a name:\n");p = gets(name); // 使用gets()函数从键盘获得字符串printf("%s is a nice name.\n", p); // 显示,确认读取数据return 0;
}
gets()的函数原型已经在stdio.h中声明,其返回值是一个指向char的指针
char *gets(char *s)
{...return (s);
}
实际gets()函数还需要考虑加入一些错误检测环节
// gets()和getchar()的用法
while(gets(name) != NULL)
while((ch = getchar()) != EOF)
不要混淆空指针和空字符:
空指针是一个地址
空字符是一个char类型的数据对象,其值为0
数值上空指针和空字符都可以用0表示,但是概念不同:NULL是一个指针,而0是一个char类型的常量