在这篇文章中,我们用C语言代码例子解释了如何在C语言中获取字符串输入。我们解释了不同的情况,如使用不同的函数获取一个字、多个字、整行和多行。
目录:
-
使用scanf函数输入字符串
1.1.读取一个字
1.2.读取多个单词
1.3.读取多个字以形成一行
1.4 . 读取一整行 -
使用getchar
-
使用gets()读取整行内容
-
使用fgets()从文件中一次读取一行
-
读取多行
让我们用C语言代码例子来学习这些技术。
使用scanf函数输入字符串
输入函数scanf可以用%s格式规范来读入一串字符。
读取一个字
例如 :
char instr[10];
scanf("%s",instr);
scanf函数的问题是,它在发现第一个空白处时就终止输入。白色空间包括空白、制表符、回车符、换行符和新行。
因此,如果输入了以下一行文本:
HELLO BOY
那么只有字符串 "HELLO "将被读入数组地址,因为 "NEW "后面的空白将终止字符串的读取。
未使用的位置被填入垃圾。
scanf函数会自动终止以空字符读取的字符串,因此,字符数组应该大到足以容纳输入的字符串加上空字符。注意,与以前的scanf调用不同,在字符数组的情况下,变量名称前不需要安培号(&)。
读取多个字
如果我们想读取整行 "HELLO BOY",那么我们可以使用两个适当大小的字符数组:
char instr1[10], instr2[10];
scanf("%s %s", instr1,instr2);
它将把字符串 "HELLO "分配给instr1,"BOY "分配给instr2:
#include<stdio.h>
#include<string.h>
int main()
{
char instr[100];
printf("Enter a string\n");
scanf("%s",bin);
printf("String is : \n");
puts(bin);
return 0;
}
如果我们把 "WELCOME TO OPENGENUS "作为输入,它将只读取WELCOME并作为输出显示。
为了解决这个问题,我们可以为字符串中的所有单词建立不同的数组。
读取多个单词以形成一个行
#include<stdio.h>
#include<string.h>
int main()
{
char instr1[100],instr2[100],instr3[100],instr4[100];
printf("Enter the string of four words\n");
scanf("%s",instr1);
scanf("%s",instr2);
scanf("%s",instr3);
scanf("%s",instr4);
printf("String is : \n");
printf("%s %s %s %s" ,instr1,instr2,instr3,instr4 );
return 0;
}
它将把四个词放在四个不同的字符数组中并显示在输出屏幕上。
读取一整行
我们已经看到,带有%s或%ws的scanf只能读取没有空白的字符串。
然而,C支持一种被称为编辑集转换代码%[...]的格式规范,可以用来读取包含各种字符的行,包括空白。
char instr[100];
scanf("%[^\n]",instr);
与上述方法类似
char instr[100];
scanf("%[ ABCDEFGHIJKLMNOPQRSTUVWXYZ]", instr);
使用getchar
我们可以重复使用它,从输入中读取连续的单个字符,并将它们放入一个字符数组。这样,一整行的文本就可以被读取并存储在一个数组中。当
输入
新的一行字符('\n')时,读取就结束了 ,然后在字符串的末端插入空字符:
#include<stdio.h>
#include<string.h>
main()
{
char instr[100] , ch;
int c = 0;
printf("Enter the line \n");
do
{
ch = getchar();
instr[c]=ch;
c++;
}while(ch != '\n');
c=c-1;
instr[c]='\0';
printf("%s \n", instr);
}
使用gets()读取整个行
另一种读取含有空格的文本字符串的方法是使用<stdio.h>头文件中的库函数gets。
它从键盘上读取字符,直到遇到一个新行字符,然后在字符串中附加一个空字符。
与scanf不同,它不跳过空格。
例如 :
char instr[100];
gets (line);
printf("%s", instr);
它将从键盘上读取一行字符并显示在屏幕上。
最后一个程序也可以写成 :
char instr[100];
printf("%s" , gets(line));
请注意,C语言不检查数组的边界,所以要注意不要输入超过所使用的字符串变量所能存储的字符。
一个完整的程序来演示Get的工作:
#include<stdio.h>
#include<string.h>
int main()
{
char instr[100];
printf("Enter a string\n");
scanf("%[^\n]",instr);
printf("The output is:-\n");
puts(bin);
return 0;
}
这个程序可以完全正常工作,它将从键盘上获取整个字符串作为输入,并在输出屏幕上显示。
使用fgets()从一个文件中一次读取一行内容
函数fgets()需要三个参数,即:
- string_name
- string_max_size
- stdin
我们可以把它写成:
fgets(string_name,string_max_size,stdin);
举例来说:
#include<stdio.h>
#include<string.h>
int main()
{
char instr[100];
printf("Enter the string\n");
fgets(instr,100,stdin);
printf("The string is:-\n");
puts(bin);
return 0;
}
它将从键盘上获取整个字符串作为输入,并在输出屏幕上显示整个屏幕。
读取多行
下面的程序从键盘上读取多行:
#include<stdio.h>
int main()
{
int s[100];
printf("Enter multiple line strings\n");
scanf("%[^\r]s",s);
printf("Entered String is\n");
printf("%s\n",s);
return 0;
}
问题
以下哪项是正确的从键盘上读取整个字符串的输入语句?
所有这些都是正确的:
gets(str)
scanf("%[^\n]",str)
fgets(instr,100,stdin)
所有这些方法都在文章中讨论过,即gets(), scanf("%[^\n]",str); 和 fgets()
问题
一个字符数组instr[]存储 "HELLO"。要完全存储这个字符串,数组 instr[] 的长度是多少?
6
5
4
没有这些
因为Hello这个词有5个字符,而且最后会有一个空字符,所以我们需要一个大小为6的数组。
问题
说明真假:"输入函数Get有一个字符串参数":
真
错
输入函数get有一个字符串参数,它从键盘上读取字符,直到遇到一个新的行字符,然后将一个空字符附加到字符串中。
因此,通过OpenGenus的这篇文章,我们已经看到了在C语言中获取输入字符串的所有可能的方法。