标题:pta上的一道题,不知道哪里出现问题,求大佬帮看一眼;
只看楼主
魂之子
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2019-12-25
结帖率:90.91%
已结贴  问题点数:20 回复次数:5 
pta上的一道题,不知道哪里出现问题,求大佬帮看一眼;
题目网址https://
还想请教一下问什么必须用getchar()把回车吃掉。

我的源码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void change(char *str,int n);
int main()
{
    int num;
    int k=0;
    char str[1000]={'\0'};
    scanf("%d",&num);
    getchar();//如果不吃掉回车str里面就是一个回车
    gets(str);
    int i,j;
    for (i=0; i<num; i++){
        int n=strlen(str)/num;
        if(strlen(str)%num!=0){
            n++;
        }
        char str2[1000];
        for(j=0; j<n; j++){
            str2[j]=str[4*j+i];
        }
        change(str2,n);
    }
  
    return 0;
}
void change(char *str,int n)
{
    int i;char c;
    for(i=0; i<n/2; i++){
        c=str[i];str[i]=str[n-1-i];str[n-1-i]=c;
    }
        //printf("%s\n",str);
        int i2;
        for(i2=0; i2<n; i2++){
            printf("%c",str[i2]);
        }
        printf("\n");
}
搜索更多相关主题的帖子: int char str num for 
2020-05-14 01:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
gets这个被C/C++废弃的函数,它就是一直读取字符,直到遇到'\n' 或 无数据可读 或 读出错。
如果你不干掉“N”后面的'\n',那它就是将此“N”直到'\n'的字符串当成一行读取。
2020-05-14 08:57
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:5 
scanf 和 gets 都是从stdin读取数据
scanf %d 不处理回车字符 回车字符会滞留再stdin里面
gets 会处理回车字符 为了避免gets读取这个回车 需要先把回车字符清理掉

https://zh.
2020-05-14 09:04
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:5 
scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中

所以如果使用scanf输入,会将'\0'留在缓存区,下次使用gets时会读取缓存中上次留下的'\0'。

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-05-14 09:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
题目本身挺有意思的

程序代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>

void ArrangeByChineseClassicalStyle( const char* s, size_t n )
{
    assert( n != 0 );
    size_t len = strlen(s);
    size_t row = n<len?n:len;
    size_t col = (len+n-1)/n;

    for( size_t r=0; r!=row; ++r )
    {
        for( size_t c=0; c!=col; ++c )
        {
            size_t index = (col-c-1)*row + r;
            putchar( index<len ? s[index] : ' ' );
        }
        putchar( '\n' );
    }
}

int main( void )
{
    //size_t n;
    //scanf( "%zu", &n );
    //scanf( "%*[^\n]" ); // 去掉输入的N 同行之后的所有字符,直到回车
    //scanf( "%*c" ); // 去掉回车

    //char s[1001];
    //fscanf( stdin, "%[^\n]%*c", s );

    //ArrangeByChineseClassicalStyle( s, n );

    ArrangeByChineseClassicalStyle( "This is a test case", 4 );
}

2020-05-14 09:20
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
得分:5 
先找到第一行col个指针,循环row, 每次col个指针+1 输出
程序代码:
#define _CRT_SECURE_NO_WARNINGS

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

char **locationColPointer(const char * str, int row) {
    int col = strlen(str) / row + (strlen(str) % row == 0 ? 0 : 1);
    char **p = (char **)malloc((col+1) * sizeof(char *));
    for (int i = 0; i < col; i++) {
        *(p+i) = str + row*(col-1-i);
    }
    *(p + col) = NULL;
    return p;

}
int main(){
    int row;
    char str[1000] = { '\0' };
    scanf("%d", &row);

    int ch;
    while (EOF != (ch = getchar()) && '\n' != ch) {}
    gets(str);

    
    char **p = locationColPointer(str, row);
    for (int i = 0; i < row; i++) {
        int j = 0;
        while (NULL != *(p + j)) {
            printf("%c ", *(p[j++] + i));
        }
        putchar('\n');
    }
    free(p);

    return 0;
}
2020-05-14 12:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501600-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.155372 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved