Ввод пользовательского ввода в массив символов (программирование на C) - PullRequest
3 голосов
/ 11 сентября 2009

Мне нужно прочитать ввод с консоли и поместить его в массив символов. Я написал следующий код, но получаю следующую ошибку: «Ошибка сегментации»

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

int main() {

    char c;
    int count;
    char arr[50];

    c = getchar();
    count = 0;
    while(c != EOF){
        arr[count] = c;
        ++count;
    }


    return (EXIT_SUCCESS);

}

Ответы [ 3 ]

9 голосов
/ 11 сентября 2009
#include <stdio.h>
#include <stdlib.h>
int main() {
    char c;                /* 1. */
    int count;
    char arr[50];
    c = getchar();         /* 2. */
    count = 0;
    while (c != EOF) {     /* 3. and 6. and ... */
        arr[count] = c;    /* 4. */
        ++count;           /* 5. */
    }
    return (EXIT_SUCCESS); /* 7. */
}
  1. c должно быть int. getchar () возвращает int, чтобы различать действительный символ и EOF
  2. Прочитать символ
  3. Сравните этот символ с EOF: если отличается, перейдите к 7
  4. Поместите этот символ в массив arr, элемент count
  5. Подготовка к добавлению «другого» символа в следующий элемент массива
  6. Проверьте символ, прочитанный в 1. для EOF

Вам нужно каждый раз читать разные символы в цикле. (3., 4., 5.)

И вы не можете поместить в массив больше символов, чем зарезервировано. (4.) * * Тысяча двадцать-одна

Попробуйте это:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int c;                 /* int */
    int count;
    char arr[50];
    c = getchar();
    count = 0;
    while ((count < 50) && (c != EOF)) {    /* don't go over the array size! */
        arr[count] = c;
        ++count;
        c = getchar();     /* get *another* character */
    }
    return (EXIT_SUCCESS);
}

Редактировать

После того, как у вас есть символы в массиве, вы захотите что-то с ними сделать, верно? Поэтому, прежде чем программа завершится, добавьте еще один цикл для их печати:

/* while (...) { ... } */
/* arr now has `count` characters, starting at arr[0] and ending at arr[count-1] */
/* let's print them ... */
/* we need a variable to know when we're at the end of the array. */
/* I'll reuse `c` now */
for (c=0; c<count; c++) {
    putchar(c);
}
putchar('\n'); /* make sure there's a newline at the end */
return EXIT_SUCCESS; /* return does not need () */

Обратите внимание, что я не использовал строковую функцию printf (). И я не использовал его, потому что arr не является строкой: это простой массив символов, который не (обязательно) имеет 0 (NUL). Только символьные массивы с NUL в них являются строками.

Чтобы поместить NUL в arr, вместо ограничения цикла до 50 символов, ограничьте его 49 (сохраните один пробел для NUL) и добавьте NUL в конце. После цикла добавьте

arr[count] = 0;
5 голосов
/ 11 сентября 2009
#include <stdio.h>
#include <stdlib.h>

int main() {

    int c;
    int count;
    int arr[50];

    c = getchar();
    count = 0;
    while( c != EOF && count < 50 ){
        arr[count++] = c;
        c = getchar();
    }


    return (EXIT_SUCCESS);

}

Обратите внимание на число && <50 </strong> в цикле while. Без этого вы можете переполнить буфер arr.

3 голосов
/ 01 июля 2012

У меня есть небольшое предложение.
Вместо c = getchar(); дважды в программе,
измените цикл while следующим образом

while( (c = getchar()) != EOF && count < 50 ){
        arr[count++] = c;
}
...