как читать строки, которые состоят из нескольких строк, и печатать символы четной цифры и символы нечетной цифры, разделенные пробелом в каждой строке - PullRequest
0 голосов
/ 20 декабря 2018

Это мой код C

int main() {
    int n,i,j,k;
    char ch[10][10000];
    char c;
    scanf("%d",&n);
    for(i=0;i<=n;i++){
        while((j<10000)&&(c=getchar()!='\n')){
        ch[i][j]=c;}}
    for(i=0;i<n;i++)
    {
        for(k=0;k<strlen(ch[j]);k+=2)
        {
            printf("%c",ch[i][j]);
        }printf("");
        for(k=1;k<strlen(ch[j]);k+=2)
        {
            printf("%c",ch[i][j]);
        }printf("\n");
    }
    return 0;
}

Я ожидаю вывод "pavan" как pvn aa, но вывод "прекращен из-за тайм-аута

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Много не так с вашим кодом.Во-первых, вы не инициализируете j каким-либо значением.И каждый раз, когда вы читаете строку текста, вы не сбрасываете ее на 0. Или фактически никогда не меняете значение.

Вы не проверяете, что n равно 10 или меньше.И вы также оставляете \n во входном буфере, так что первая строка текста, которую вы читаете, не соответствует вашим ожиданиям.Было бы лучше использовать fgets для чтения всей строки, а затем использовать sscanf для извлечения числа.

Этот цикл считывает слишком много строк ... что может быть способомвокруг вас, не очищая ввод перед чтением в строках, но не решает проблему.

for(i=0;i<=n;i++)

И тогда у вас есть эта строка, и она соответствует нечетным числам ...

for(k=0;k<strlen(ch[j]);k+=2)

j по-прежнему указывает на какое-то неопределенное значение.Но вы не должны использовать j, вы должны использовать i.

for(k=0;k<strlen(ch[i]);k+=2)

И затем внутри цикла вы вообще не используете k, так что это довольно бессмысленно.Также использование strlen() как это означает, что для времени вокруг цикла он пересчитывает длину строки.

После того, как все различные ошибки исправлены, ваш код будет выглядеть следующим образом ...

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

int main() {
    int n,i,j;
    char ch[10][10000];

    fgets(ch[0],10000,stdin);
    sscanf(ch[0],"%d",&n);
    if((n>10)||(n<1)) {
        printf("Invalid number\n");
        return 0;
    }

    for(i=0;i<n;i++) {
        fgets(ch[i],10000,stdin);
        if(strchr(ch[i],'\n')) {
            *(strchr(ch[i],'\n'))='\0';
        }
    }

    for(i=0;i<n;i++) {
        for(j=0;j<strlen(ch[i]);j+=2) {
            printf("%c",ch[i][j]);
        }
        printf(" ");
        for(j=1;j<strlen(ch[i]);j+=2) {
            printf("%c",ch[i][j]);
        }
        printf("\n");
    }
    return 0;
}
0 голосов
/ 20 декабря 2018

Вот некоторые проблемы:

int main() {
    int n,i,j,k;      
    char ch[10][10000];
    char c;
    scanf("%d",&n);
    for(i=0;i<=n;i++){                            // Use < instead of <=
                                                  // j is not initialized
        while((j<(10000-1))&&(c=getchar()!='\n')){    // missing () around c=getchar()
        ch[i][j]=c;}}                             // j is not incremented 
                                                  // string never terminated
    for(i=0;i<n;i++)
    {
        for(k=0;k<strlen(ch[j]);k+=2)             // j should be i
        {
            printf("%c",ch[i][j]);                // j should be k
        }
        printf("");                               // missing space
        for(k=1;k<strlen(ch[j]);k+=2)             // j should be i
        {
            printf("%c",ch[i][j]);                // j should be k
        }printf("\n");
    }
    return 0;
}

исправление, например:

#define MAX 10000

int main() {
    int n,i,j=0,k;
    char ch[10][MAX];
    char c;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        j = 0;
        while((j < (MAX-1)) && ((c=getchar()) != '\n')){
            ch[i][j++]=c;
        }
        ch[i][j++]='\0';  // Terminate string 
    }
    for(i=0;i<n;i++)
    {
        for(k=0;k<strlen(ch[i]);k+=2)
        {
            printf("%c",ch[i][k]);
        }
        printf(" ");
        for(k=1;k<strlen(ch[i]);k+=2)
        {
            printf("%c",ch[i][k]);
        }printf("\n");
    }
    return 0;
}

результат:

Ввод: 1pavan

Ouput: pvn aa

Кстати:

Обратите внимание, что между числом и строкой во вводе нет новой строки!Если вы поместите туда новую строку, текстовая строка будет пустой.Это связано с тем, что scanf оставляет новую строку в буфере.

Также обратите внимание, что вы не проверяете возвращаемое значение scanf, чтобы убедиться, что вы получили действительное число.Таким образом, если введено значение abc (т.е. номер не начинается с), переменная n неинициализирована, что может привести к ошибке сегмента.

Либо проверьте возвращаемое значение scanf и обработайте ошибки, либо по крайней мереинициализировать как: n = 0;

0 голосов
/ 20 декабря 2018

in while((j<10000)&&(c=getchar()!='\n')) ch[i][j]=c;}} 'j' не инициализируется ранее и не изменяется в цикле

В случае, если случайно случайное значение 'j' будет <10000, вы введете свою строку, но она будет сохранена вслучайное расположение, повреждающее память и, возможно, вызывающее ошибку сегментации </p>

Независимо от того, что вы не заканчиваете вводные строки, когда вы читаете '\ n', вставьте '\ 0' в ch[i][j]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...