c - 将两个字符串读入 1 个变量

标签 c string scanf

所以我正在做一项作业,我们将从输入文件中读入名字,后跟姓氏和其他信息。老师要我们把名字和姓氏设为一个变量。

例如:

输入: (教师#,名字,姓氏,年龄) “123 苏西提示 42”

如何将“suzie cue”存储在一个变量中,同时仍将其他整数存储在它们自己的变量中? 换句话说,我有 4 个来自文件的输入,但我只有 3 个变量。

编辑--------我不得不改写问题,因为我意识到我没有提供足够的信息。抱歉造成混淆。

最佳答案

当读取作为文本行输入的任何输入时,通常最好使用面向行的输入将整行读入字符串(或缓冲区).这使您能够使用您喜欢的任何方法解析该缓冲区。这比试图将行格式硬塞进 scanf 语句要灵活得多。

面向行的输入的主要工具是 fgetsgetline。两者都可以,但我更喜欢 getline,因为它提供了作为返回读取的实际字符数,并且能够为您动态分配足以容纳读取的整个字符串的缓冲区。 (用完一定要记得释放空间)

解析缓冲区相当简单。您的值由 空格 分隔。您知道第一个空格位于 Faculty# 之后,并且您知道最后一个空格将 nameage 分开。您可以使用 strchrstrrchr 非常简单地找到第一个和最后一个空格。你知道介于两者之间的一切都是名字。这有一个巨大的好处。名字是 first lastfirst middle lastfirst middle last, suffix 等等都没关系...你得到它作为名称。

在你成功解析缓冲区后,你有 Facuty#age 作为字符串。如果您需要它们作为 integerslongs,那完全没有问题。使用 atoistrtol 的简单转换使转换变得轻而易举。这就是首选面向行的输入的原因。您可以完全控制解析缓冲区,并且不受 scanf 格式字符串 的限制。

这是使用面向行的输入获取数据的示例。如果愿意,您可以将所有值永久存储在一个数组中。为了这个问题,我刚刚打印了它们。查看示例,如果您有任何问题,请告诉我:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void) {

    char *line = NULL;      /* pointer to use with getline ()       */
    ssize_t read = 0;       /* number of chars actually read        */
    size_t n = 0;           /* limit read to n chars (0 - no limit) */
    int cnt = 0;            /* count of lines read                  */
    int spcs;               /* counter to count spaces in line      */
    char *p = NULL;         /* general pointer to use               */

    char *fnumber = NULL;   /* faculty number   */
    char *name = NULL;      /* teacher name     */
    char *age = NULL;       /* teacher age      */

    printf ("\n Enter Faculty Information (Faculty# Name Age) (press [ctrl+d] when done)\n\n");

    while (printf ("  input: ") && (read = getline (&line, &n, stdin)) != -1) {

        if (read > 0 && *line != '\n') {    /* validate input, not just [enter] */

            if (line[read - 1] == '\n') {   /* strip newline */
                line[read - 1] = 0;
                read--;
            }

            p = line;                   /* validate at least 3 spaces in line   */
            spcs = 0;
            while (*p) {
                if (*p == ' ')
                    spcs++;
                    p++;
            }

            if (spcs < 3)               /* if not 3 spaces, get new input       */
                continue;

            p = strrchr (line, ' ');    /* find the last space in line          */

            age = strdup (++p);         /* increment pointer and read age       */
            --p;                        /* decrement pointer and set null       */
            *p = 0;                     /* line now ends after name             */

            p = strchr (line, ' ');     /* find first space in line             */
            *p++ = 0;                   /* set to null, then increment pointer  */

            fnumber = strdup (line);    /* read faculty number (now line)       */
            name = strdup (p);          /* read name (now p)                    */

            printf ("\n    Faculty #: %-10s name: %-24s age: %s\n\n", fnumber, name, age);

            /* free all memory allocated by strdup*/
            if (fnumber) free (fnumber);
            if (name) free (name);
            if (age) free (age);

            cnt++;                      /* count this as a valid read           */
        }
    }

    if (line) free (line);              /* free line allocated by getline       */

    printf ("\n\n  Number of faculty entered : %d\n\n", cnt);

    return 0;
}

输出:

$ ./bin/faculty

 Enter Faculty Information (Faculty# Name Age) (press [ctrl+d] when done)

  input: 100 Mary P. Teacher 45

    Faculty #: 100        name: Mary P. Teacher          age: 45

  input: 101 John J. Butterworth, Jr. 52

    Faculty #: 101        name: John J. Butterworth, Jr. age: 52

  input: 102 Henry F. Principal 62

    Faculty #: 102        name: Henry F. Principal       age: 62

  input: 103 Jim L. Lee, III, PhD 71

    Faculty #: 103        name: Jim L. Lee, III, PhD     age: 71

  input:

  Number of faculty entered : 4

关于c - 将两个字符串读入 1 个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27032603/

相关文章:

C - *x++ = *y++ 是否定义明确?

ruby-on-rails - PG::将字符串列更改为时间数据类型时出错时区

c - fscanf() 不适用于输入

java - 如何从字符串中分离字母和符号。(即将完成)

c# - 在保留 P、BR、UL、OL 的同时将 HTML 转换为纯文本?

c - 在 fget 之前进行扫描

c - 如何使用 sscanf 检索包含空格的字符串

c - 从C盘尾部读取数据

c - 在 pthread_create 中传递 char ***

c - 信号处理程序中的格式化 I/O