如何在C语言中获取字符串输入

1,133 阅读5分钟

在这篇文章中,我们用C语言代码例子解释了如何在C语言中获取字符串输入。我们解释了不同的情况,如使用不同的函数获取一个字、多个字、整行和多行。

目录:

  1. 使用scanf函数输入字符串
    1.1.读取一个字
    1.2.读取多个单词
    1.3.读取多个字以形成一行
    1.4 . 读取一整行

  2. 使用getchar

  3. 使用gets()读取整行内容

  4. 使用fgets()从文件中一次读取一行

  5. 读取多行

让我们用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()需要三个参数,即:

  1. string_name
  2. string_max_size
  3. 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语言中获取输入字符串的所有可能的方法。