在C语言中,scanf是一个常用的函数,用于从标准输入流stdin中读取各种类型的数据。但对于输入字符串(或字符数组),scanf操作起来可能不那么直观,需要一番技巧。如果你也有类似的困惑,那么本文将为你提供详细的教程,帮助你快速掌握如何使用scanf读取字符串。
一、scanf函数简介
在开始讲解scanf如何读取字符串之前,我们先来简单介绍一下scanf函数。在C语言中,scanf函数主要用于从标准输入流stdin中读取各种类型的数据,例如整型、浮点型、字符型等。其函数原型如下:
int scanf(const char *format, ...)
其中,format参数是一个字符串,用于指定输入数据的格式。在这个格式字符串中,可以包含两种类型的字符:
①转换字符,如%d,%f,%c等,用于指定输入数据的类型;
②空格和其他字符,用于指定输入格式的分隔符。
scanf函数有很多的扩展用法,但本文重点介绍如何读取字符串。接下来,我们将通过示例代码来演示。
二、使用scanf读取字符串
从标准输入流中读取字符串是非常常见的操作。比如我们需要读取用户输入的姓名、地址、电话号码等信息,这些都是字符串类型。因此,我们需要使用scanf函数来完成字符串的读取操作。
1、读入一个单词
首先我们来看一个简单的例子,在这个例子中,我们只需要从标准输入流中读入一个单词(单词即:由字母、数字、下划线组成的连续字符序列)。这个例子很简单,但是会涉及到scanf读取字符串时需要注意的问题。
代码如下:
```c
#include
int main()
{
char word[1024];
printf("请输入一个单词:\n");
scanf("%s", word);
printf("您输入的单词是:%s\n", word);
return 0;
}
```
这个程序仅包含三行代码,但是很好地展示了如何通过scanf读取字符串。程序首先定义了一个字符数组word,用来存储用户输入的单词。然后,我们调用scanf函数读取用户的输入,%s指定了需要读取一个字符串。需要注意的是,在%s前面不需要加&符号,因为数组名就代表了数组的地址。
最后,我们打印出用户输入的单词。如果你在测试中输入了“Hello”这个单词,程序的输出结果应该是“您输入的单词是:Hello”。
2、读入一行
在实际开发中,我们更多地需要读入一整行数据,而不是仅仅读取一个单词。因此,我们需要将输入数据封装在一个循环中,每次读取一行,直到读完全部数据为止。
代码如下:
```c
#include
int main()
{
char line[1024], ch;
int i = 0;
printf("请输入一行文字:\n");
while ((ch = getchar()) != '\n') // 读取每个字符
{
line[i++] = ch; // 存储输入的每个字符
}
line[i] = '\0'; // 末尾加上 NUL 字符
printf("您输入的文字是:%s\n", line);
return 0;
}
```
这个程序使用getchar函数来逐个读取用户输入的每个字符,循环结束条件是读取到换行符\n。在每次循环中,我们将读取到的字符存储在字符数组line中,同时计算字符的个数i。
当循环结束后,我们在字符串line的最后加上NUL字符(这个字符的ASCII码值为0),用来表示字符串的结尾。最后,在屏幕上输出所有输入的字符组成的字符串。
要测试这个程序,你只需要输入一些文字,然后按下回车键即可。
三、scanf字符串输入质疑
有些读者可能会产生疑问:既然scanf函数可以读取一个单词或一行,为什么我们还需要使用getchar函数来逐个读取字符呢?直接使用scanf("%s",str)不就可以了吗?
事实上,如果你使用scanf("%s",str),程序会无法正确处理用户输入的空格、制表符、回车等字符。在接下来的代码中,我们使用scanf函数读取一行数据,然后将其输出为字符串。但是,如果用户输入了空格,在将其输出时,程序会将空格后面的字符全部去掉。这显然不是我们想要的结果。
代码如下:
```c
#include
int main()
{
char str[1024];
printf("请输入一行数据:\n");
scanf("%s", str);
printf("您输入的数据是:%s\n", str);
return 0;
}
```
如果用户输入了“Hello, World!”这行数据,程序的输出结果却是“您输入的数据是:Hello,”,并且丢失了逗号后面的字符。这是因为scanf函数遇到空格就认为输入结束,所以只输出了第一个单词。
为了避免这个问题,我们需要使用fgets函数来读取字符串。与scanf函数不同的是,fgets可以读取包括空格在内的整行字符。它的函数原型如下:
char* fgets(char* str, int num, FILE* stream);
该函数用于从文件流中读取一行数据,包括终止的换行符,然后将其放入指定的字符数组中。其中,str参数是要存储数据的目标字符串指针;num参数是存储的字符数,一般等于目标字符串的长度减1;stream表示要读取的文件流。
代码如下:
```c
#include
int main()
{
char str[1024];
printf("请输入一行数据:\n");
fgets(str, 1024, stdin);
printf("您输入的数据是:%s\n", str);
return 0;
}
```
这个程序使用fgets函数读取用户输入的一行数据,并将其存储在字符数组中。注意,fgets函数会在读到换行符(\n),或者输入字符数达到上限时停止读取。
再次输入“Hello, World!”这行数据,程序的输出结果应该是“您输入的数据是:Hello, World!\n”。
四、总结
本文详细介绍了如何使用scanf函数读取字符串。我们从单词读取开始,逐步介绍了如何读取一行数据,并通过实例演示了scanf字符串输入只读取单词的问题。最后,我们推荐了使用fgets函数来读取一整行数据的方法。希望此篇文章对于初学者来说对原scanf()使用不得当造成的疑问和困惑有所帮助。