教你夺冠


私信TA

用户名:835685327

访问量:156776

签 名:

相互交流 相互学习

等  级
排  名 15
经  验 22543
参赛次数 0
文章发表 84
年  龄 0
在职情况 学生
学  校 辣鸡施工大学
专  业

  自我简介:

努力刷题 熟能生巧!

这道题目我的思路如下:

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;
}

那么问题来了...

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

欢迎留言交流!

 

0.0分

29 人评分

  评论区

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

int main(void)
{
	int i = 0, j = 0, N = 0, count = 0, len = 0;
	char str[128][1001] = {'\0',};
	scanf("%d%c", &N);
	while (1) {
		if (NULL == gets(str[count++]))break;
	}
	for (i = 0; i < N; ++i) {
		printf("%s\n\n", str[i]);
	}
	for (i = N; i < count; ++i) {
		len = strlen(str[i]);
		for (j = 0; j < len+1; ++j) {
			if (str[i][j] == ' ' || str[i][j] == '	' || str[i][j] == '\0') {
				printf("\n\n");
			}
			else {
				printf("%c", str[i][j]);
			}
		}
	}
	return 0;
}
这样也可以
2020-02-07 16:22:20
未知大小,定义字符指针数组里面char *inputstr[N];N不能是位置  不然内存无法分配空间  char *inputstr[5];这样正确
2019-11-15 16:23:53
数组定义错了吧
2019-11-15 16:06:48
你这个每个指针开始的点还是指向字符串数组啊,而不是新建立了一个字符串数组啊
2019-09-26 21:37:39
想法很好,但是在c语言中所有声明语句必须在所有执行语句之前!你的定义数组和指针的语句前面还有scanf等非声明语句
2018-10-29 14:50:57
在栈中可以用变量作为数组的维度?
2018-10-22 21:04:11
EOF来判断输入结束可以吗?
2018-05-27 12:43:15