注册 登录
编程论坛 C语言论坛

pta上的一道题,不知道哪里出现问题,求大佬帮看一眼;

魂之子 发布于 2020-05-14 01:34, 1755 次点击
题目网址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");
}
5 回复
#2
rjsp2020-05-14 08:57
gets这个被C/C++废弃的函数,它就是一直读取字符,直到遇到'\n' 或 无数据可读 或 读出错。
如果你不干掉“N”后面的'\n',那它就是将此“N”直到'\n'的字符串当成一行读取。
#3
lin51616782020-05-14 09:04
scanf 和 gets 都是从stdin读取数据
scanf %d 不处理回车字符 回车字符会滞留再stdin里面
gets 会处理回车字符 为了避免gets读取这个回车 需要先把回车字符清理掉
#4
纯蓝之刃2020-05-14 09:11
scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中

所以如果使用scanf输入,会将'\0'留在缓存区,下次使用gets时会读取缓存中上次留下的'\0'。
#5
rjsp2020-05-14 09:20
题目本身挺有意思的

程序代码:
#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 );
}

#6
fulltimelink2020-05-14 12:14
先找到第一行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;
}
1