这道题目我的思路如下:

1) 定义一个字符指针数组,用来存放将要输入的各个字符串的指针(用动态内存分配开辟空间存放数组)

2) 遍历这个字符指针数组,前N行字符串原样输出

3) 余下的字符串以空格或回车分割依次按行输出


该程序几处需要注意的地方:

1、因为我习惯用scanf("%[^\n]", strtmp)输入字符串的方式,所以在输入最开始的正整数N之后的回车换行符和接下来每次输入一个字符串后的回车换行符都得使用getchar函数吃掉,要不然会出现错误!

2、在思路3)中我使用了这个技巧:while ((c = *(inputstr[index]++)) != '\0')。即通过指针的方式获取这个字符串对应的每个字符,碰到结束符'\0'才结束循环,当c为空格符时,就连续输入两个换行符,当c不是空格符时直接输出。

    

参考代码:

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

int main(void)
{
    int N;
    scanf("%d", &N);
    if (N > 100) //输入的N最多为100 超过则直接退出
    {
        return -1;
    }
    getchar(); //吃掉上面输入中回车符给下面输入字符串带来的影响

    char *inputstr[N + N]; //定义一个字符指针数组,用来存放将要输入的各个字符串的指针
    char strtmp[1000];     //strtmp临时变量存放每次输入的字符串
    int i = 0;             //字符指针数组下标

    while (scanf("%[^\n]", strtmp) != EOF)
    {
        getchar(); //吃掉上一个字符串中回车符对下一个字符串输入带来的影响

        //对于每个字符串动态分配空间并拷贝
        int len = strlen(strtmp);
        inputstr[i] = (char*)malloc(len + 1);
        strcpy(inputstr[i], strtmp);
        i++;
    }

    int index = 0;
    for (index = 0; index < i; index++)
    {
        if (index < N) //前N行字符串原样输出
        {
            printf("%s\n", inputstr[index]);
            printf("\n");
        }
        else //余下的字符串以空格或回车分割依次按行输出
        {
            char c;
            while ((c = *(inputstr[index]++)) != '\0')
            {
                if (c == ' ')
                {
                    putchar(' ');
                    printf("\n\n");
                }
                else
                {
                    putchar(c);
                }
            }
        }
    }

    return 0;
}

那么问题来了...

为啥这个程序还是不能通过...一直是答案错误 也是很心累 求大神告知!!

欢迎留言交流!

点赞(5)
 

0.0分

25 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 25 条评论

彩虹 2年前 回复TA
#include <iostream>
#include <string>
#include <array>
#define MAX 200

using namespace std;

int main()
{
	// define variable
	int N{};
	array<string, MAX> str{};
	// input
	do {
		cin >> N;
	} while (N > 100);
	cin.get();
	for (int i = 0; i < N; i++) {
		getline(cin, str[i]);
	}
	while (cin >> str[N++]) {}
	// output
	for (int i = 0; ; i++) {
		if (str[i] == "\0") {
			break;
		}
		cout << str[i] << endl << endl;
	}
	return 0;
}
用C++写简单点,关键在于输入时以什么为结尾(本题默认EOF),输出时以什么判断条件来终止(输入完毕后,该数组结尾处为"\0",注意因为是字符串型,所以双点)
fe 2年前 回复TA
@哈弗哈 输入 ?但是也不成功啊
fe 2年前 回复TA
@哈弗哈 如何判断输入结束
哈弗哈 3年前 回复TA
输出格式错了而已
哈弗哈 3年前 回复TA
if (index < N) //前N行字符串原样输出
            printf("%s\n\n", inputstr[index]);
        else //余下的字符串以空格或回车分割依次按行输出
        {
            char c;
            while ((c = *(inputstr[index]++)) != '\0')
            {
                if (c == ' ')
                {
                    c = '\n';
                    putchar(10);
                }
                    putchar(c);
            }
            printf("\n\n");
        }
    }
    for(i = 0; i < N; ++i)
        free(inputstr[i]);
    return 0;
}
哈弗哈 3年前 回复TA
@哈弗哈 if (index < N) //前N行字符串原样输出             printf("%s

", inputstr[index]);         else //余下的字符串以空格或回车分割依次按行输出         {             char c;             while ((c = *(inputstr[index]++)) != &#039;&#039;)             {                 if (c == &#039; &#039;)                 {                     c = &#039;
&#039;;                     putchar(10);                 }                     putchar(c);             }             printf("

");         }     }     for(i = 0; i < N; ++i)         free(inputstr[i]);     return 0; }
哈弗哈 3年前 回复TA
@哈弗哈 这个是正确的
哈弗哈 3年前 回复TA
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define M 1000
int main(void)
{
    int N;
    scanf("%d", &N);
    getchar(); //吃掉上面输入中回车符
    char *inputstr[N]; //定义一个字符指针数组,用来存放将要输入的各个字符串的指针
    char strtmp[M];
    int i = 0;
    while(gets(strtmp))   //while (scanf("%[^\n]", strtmp) != EOF)
    {
        //getchar(); //吃掉上一个字符串中回车符对下一个字符串输入带来的影响
        //对于每个字符串动态分配空间并拷贝
        int len = strlen(strtmp);
        inputstr[i] = (char*)malloc(len + 1);
        strcpy(inputstr[i], strtmp);
        i++;
    }
    int index = 0;
    for (index = 0; index < i; index++){
        if (in
哈弗哈 3年前 回复TA
很不错
uq_26490723675 3年前 回复TA
长的一批,最后你来个答案错误????