Строковый ввод с помощью getchar

У меня небольшая проблема с моим кодом, почему, когда я использую printf для строки1 (последняя строка), он не дает мне то, что я написал для этой переменной?

Например, если я написал: asdfgh, строка1 даст мне что-то странное, например: @>>..

Есть идеи ?

Спасибо за помощь.

 int main()
{
    int length;
    int i = 0;
    char string1[100];
    printf("Please enter the length of the two strings\n");
    scanf("%d", &length);

    printf("\nPlease enter the first string\n");
    while((string1[i] = getchar())!='\n')
        i++ ;
    getchar();
    printf("\nString 1 : %c", string1);

    return 0;
}

person user3605367    schedule 12.05.2014    source источник
comment
вы имели в виду %s в printf("\nString 1 : %s", string1); также не забудьте поставить нуль-терминатор.   -  person Jack    schedule 13.05.2014
comment
В этом коде есть несколько ошибок, но самая непосредственная заключается в том, что ваша строка не завершается нулем, и вы используете строки от %s до printf(), а не %c.   -  person Crowman    schedule 13.05.2014
comment
Спасибо, я изменил% и попросил помощи для завершения строки. Это первый я использую getchar .. Это немного проблематично для меня :s   -  person user3605367    schedule 13.05.2014
comment
Другая серьезная проблема заключается в том, что цикл while считывает остаток первой строки, где пользователь ввел длину и нажал клавишу ввода. Все, что пользователь вводит после появления второго приглашения, не будет прочитано.   -  person M.M    schedule 15.05.2014


Ответы (2)


У вас есть несколько проблем:

1) Следует использовать %s для вывода строки.
2) Завершать строку символом NULL (до этого это не строка;)
3) использовать стандартный прототип для main(), например: int main(void)

person P.P    schedule 12.05.2014
comment
Привет! Спасибо за ваш ответ, вы правы. Нулевой терминатор - это '\ 0', да? Где я могу найти помощь в этом? Потому что в этом случае я не знаю, как завершить строку. Спасибо. - person user3605367; 13.05.2014
comment
Да '\0' или просто 0 подойдет. После цикла добавьте: string1[i]='\0'; Помните, что вы можете ввести только 99 символов (+1 для NULL). В противном случае вы столкнетесь с дополнительными проблемами. - person P.P; 13.05.2014
comment
Ах! Да, конечно, я написал string1[100]='\0', а не я! (Моя ошибка). Теперь мой код: int main(void) { int length; int i = 0; char string1[101]; printf("Please enter the length of the two strings\n"); scanf("%d", &length); printf("\nPlease enter the first string\n"); while((string1[i] = getchar())!='\n') i++ ; string1[i] = '\0'; getchar(); printf("\nString 1 : %s", string1); return 0; } - person user3605367; 13.05.2014
comment
Я не думаю, что у вас должен быть последний getchar() после того, как вы вставили терминатор NULL, я думаю, это сбивает с толку входной буфер. - person ojs; 13.05.2014
comment
Хорошо, есть еще одна проблема. Вам нужно использовать еще один getchar() сразу после вызова scanf(), чтобы потреблять \n слева, что приводит к сбою условия цикла while сразу, без входа в цикл вообще. TBH, я не понимаю смысла чтения length, так как вы его нигде не используете. Кроме того, scanf() не является удобной функцией ввода, о которой вам следует прочитать подробнее. Вот один из них: c-faq.com/stdio/scanfprobs.html. - person P.P; 13.05.2014
comment
@Blue Moon, вы правы :)) просто нужно переместить сюда getchar()! Теперь это работает. Спасибо. А что касается length, он мне понадобится для продолжения моей программы. Можно создать строку1[длина] вместо строки1[101], да? Потому что на самом деле именно пользователь определяет длину моей строки1.. Я думаю, так будет лучше. - person user3605367; 13.05.2014
comment
@user3605367 Если у вас нет поддержки VLA (c99 или более поздней версии), вы не сможете сделать string1[length]. Если это не поддерживается, вам потребуется динамическое размещение. - person P.P; 13.05.2014
comment
@Голубая луна Хорошо, я прочитаю :). И мой последний маленький вопрос: если я хочу запросить, чтобы пользователь написал другую строку, getchar() сразу после scanf, я думаю, будет недостаточно? - person user3605367; 13.05.2014
comment
Этот дополнительный getchar() для использования \n необходим всякий раз, когда соответствующая строка формата не использует чтение/очистку входного буфера. На это нет общего ответа (нужно ли вам больше getchar()). Вам следует избегать использования scanf(), если это возможно. Подробнее об этом в ссылке, которую я разместил ранее. - person P.P; 13.05.2014

 #include <stdio.h>
 int main(void)
 {
    int length;
    int i = 0;
    int ch;
    char string1[100];
    printf("Please enter the length of the two strings\n");
    scanf("%d", &length);
    getchar();
    printf("\nPlease enter the first string\n");
    /* use null for termination of string */
    /* Press Ctrl+d to end your input */
    while((ch = getchar()) != EOF){
            string1[i++] = ch;

    }
    string1[i] = '\0';
    /* USE %s to print whole string */
    printf("\nString 1 : %s\n", string1);

    return 0;
  }

Надеюсь, это решит вашу проблему

person Vineet    schedule 15.05.2014