从标准输入读取字符串 [英] Reading strings from stdin

查看:209
本文介绍了从标准输入读取字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从stdin读取一行以这样的格式:

I'm trying to read a line from stdin with this kind of format:

波士顿纽约,旧金山孟菲斯(注意有一个空间,串在其中的括号内。另外请注意,每个城市名称用空格隔开。)
我试过同时与scanf的一个阅读,FGETS整条生产线,然后显示关键字,但坏的结果。
我pretend是一切存储在muldimensional字符数组供以后使用。

Boston "New York" "San Francisco" Memphis (note that string with a space in them are between brackets. Also note that each city name is separated by a space.) I've tried to read this with scanf one at a time, fgets the whole line and then tokenizing, but with bad results. What I pretend is to store everything in a muldimensional char array for later use.

这是我应该怎么解决这个问题有什么建议?谢谢你在前进!

Any suggestions on how I should solve this problem? Thank you in advance!

推荐答案

您可以在整条生产线读取并分析自己很容易不够。如果你要来的第一个非空白字符不是,然后读出来,直到下一个空格。如果是,则读取直到下一个presuming你不必担心转义引号。

You can read in the whole line and parse it yourself easily enough. If the first non-whitespace character you come to is not a ", then read until the next space. If it is, then read until the next ", presuming you don't need to worry about escaped quotes.

下面是一个简单的实现:

Here's a simple implementation:

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

#define MAX_BUFFER 100
#define MAX_STRINGS 10

int main(void) {
    char buffer[MAX_BUFFER];

    if ( !fgets(buffer, MAX_BUFFER, stdin) ) {
        fprintf(stderr, "Couldn't get input.\n");
        return EXIT_FAILURE;
    }
    else {

        /*  Remove trailing newline, if present  */

        size_t length = strlen(buffer);
        if ( length && buffer[length - 1] == '\n' ) {
            buffer[length - 1] = '\0';
        }
    }

    char *my_strings[MAX_STRINGS + 1] = {NULL};
    int read_strings = 0;
    char *buf_ptr = buffer;

    while ( *buf_ptr && read_strings < MAX_STRINGS ) {
        char temp_buf[MAX_BUFFER] = {0};
        char *temp_ptr = temp_buf;

        /*  Skip leading whitespace  */

        while ( *buf_ptr && isspace(*buf_ptr) ) {
            ++buf_ptr;
        }

        if ( *buf_ptr ) {
            if ( *buf_ptr == '"' ) {

                /*  If starts with '"', read to next '"'...  */

                ++buf_ptr;      /*  Skip first "  */
                while ( *buf_ptr && *buf_ptr != '"' ) {
                    *temp_ptr++ = *buf_ptr++;
                }

                if ( *buf_ptr ) {
                    ++buf_ptr;  /*  Skip second "  */
                }
            }
            else {

                /*  ...otherwise, read to next whitespace  */

                while ( *buf_ptr && !isspace(*buf_ptr) ) {
                    *temp_ptr++ = *buf_ptr++;
                }
            }

            /*  Copy substring into string array  */

            my_strings[read_strings] = malloc(strlen(temp_buf) + 1);
            if ( !my_strings[read_strings] ) {
                fprintf(stderr, "Couldn't allocate memory.\n");
                return EXIT_FAILURE;
            }
            strcpy(my_strings[read_strings++], temp_buf);
        }
    }

    for ( size_t i = 0; my_strings[i]; ++i ) {
        printf("String %zu: %s\n", i + 1, my_strings[i]);
        free(my_strings[i]);
    }

    return 0;
}

示例输出:

paul@MacBook:~/Documents/src/scratch$ ./ql
Boston "New York" "San Francisco" Memphis
String 1: Boston
String 2: New York
String 3: San Francisco
String 4: Memphis
paul@MacBook:~/Documents/src/scratch$ ./ql
a quoted "word" and "some quoted words" and an "unclosed quoted string
String 1: a
String 2: quoted
String 3: word
String 4: and
String 5: some quoted words
String 6: and
String 7: an
String 8: unclosed quoted string
paul@MacBook:~/Documents/src/scratch$ 

这篇关于从标准输入读取字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆