题解详情:
这道题目我的思路如下:
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;
}