Janvy


私信TA

用户名:sunjianwei

访问量:3161

签 名:

每天一道题

等  级
排  名 2692
经  验 2103
参赛次数 5
文章发表 1
年  龄 19
在职情况 学生
学  校 湖南理工学院
专  业 网络工程

  自我简介:

TA的其他文章

解题思路:
在全局定义一个指针数组,用于指向后面输入的字符串;

开始输入数n,之后的n个字符串用gets函数来接收(gets函数能接收空格);

之后的字符串就用普通的cin或者scanf来接收,依次用数组指针指向这些字符串;

最后利用这个指针数组来进行输出;

注意事项:
主要是那个输入缓冲区的问题,用cin和scanf输入的时候都会留一个换行到输入缓冲区中;

而gets函数或者cin.get或cin.getline函数一识别到输入缓冲区中有换行就结束了;




参考代码:

#include<iostream>
#include<string.h>

using namespace std;

char *p[128] = { NULL };

int main(void)
{
    int n;
    cin >> n;
    char buf[100] = { 0 };
    int count = 0;    //记录一共输入了多少字符串
    gets(buf);    //将缓冲区的换行接收,相当于刷新输入缓冲区,虽然标准的是用cin.sync()函数或fflush(stdin)来刷新,

                       //但是这OJ编不过;
    
    /*
        如果此处没有刷新输入缓冲区,那么还有一个换行在缓冲区中,
        之后的gets函数就会将这个换行当成结束符,从而直接结束第一次的gets输入;
    */

    while (count < n)            //用gets函数接收前n个字符串,可以接收空格;
    {
        gets(buf);
        int len = strlen(buf);
        p[count] = new char[len + 1];
        strcpy(p[count], buf);
        count++;
        memset(buf, 0, sizeof(buf));    //将buf中的所有元素置0;
    }

    while (~scanf("%s", buf))        //之后的字符串用scanf接收;
    {
     
        int len = strlen(buf);
        p[count] = new char[len + 1];
        strcpy(p[count], buf);
        count++;
        memset(buf, 0, sizeof(buf));
    }

    for (int i = 0; i < count; i++)        //输出的同时释放所有new出来的空间,避免造成内存泄漏;
    {
        cout << p[i] << endl;
        if (i != count - 1)
            cout << endl;
        if (p[i] != NULL)
        {
            delete p[i];
            p[i] = NULL;
        }
    }

    return 0;
}

 

0.0分

11 人评分

  评论区