C Char Array Userinput проверяет длину - PullRequest
3 голосов
/ 15 декабря 2011

Я прочитал в массиве char с scanf и хочу проверить, больше ли длина, чем 15. Это работает только иногда. (Если нет, я получаю сообщение об ошибке -> ядро ​​сброшено.)

Мой код:

#include <stdio.h>

int checkArray(char string[], int length) {
    int i;
    for(i=0; string[i] != '\0'; i++);
    if(i > length) {
        return -1;
    }
    return 0;
}

int main ()
{
    const int length = 15;
    char x[15];
    scanf("%s", x);
    if(checkArray(x, length) == -1) {
        printf("max. 15 chars!");
        return 1;
    }
    return 0;
}

Ответы [ 4 ]

5 голосов
/ 15 декабря 2011

x никогда не может (юридически) иметь размер более 14 символов, поскольку он находится в буфере размером 15 (14 пробелов для символов, один для NUL-терминатора), поэтому бессмысленно пытаться проверить, длина не более 15 символов.

Если вы попытаетесь сохранить в нем строку больше 14, это приведет к переполнению массива и, как мы надеемся, вызовет ошибку, подобную той, которую вы испытываете. При желании можно увеличить массив, чтобы он мог содержать более 15 символов, и указать спецификатор ширины для %s:

char x[30];

scanf("%29s", x); // read a maximum of 29 chars (replace 29 if needed
                  // with one less than the size of your array)

checkArray(x, 15);
1 голос
/ 15 декабря 2011

Когда scanf читает строку длиной более 14 символов (резервируя один для терминатора null), это приводит к повреждению памяти.Тогда есть пара проблем с вашим checkArray() методом:

int checkArray(char string[], int length) {
    int i;

    // This next line could as well be a call to `strlen`.
    // But you shouldn't let it access `string` when `i` is >= `length`. 
    for(i=0; string[i] != '\0'; i++);

    // This should be `>=`.  If `i` is 15, you accessed (in the loop above)
    // `string[15]`, which is past the end of the array.
    if(i > length) {
        return -1;
    }

    return 0;
}
0 голосов
/ 19 августа 2015

вместо возврата -1 и 0 возвращает что-то еще, например, длину вместо -1 и i вместо 0, и соответственно изменяет условие в основной функции.тогда программа будет выдавать вывод каждый раз. (не знаю логики, но у меня это работает)

0 голосов
/ 15 декабря 2011

Это классическое переполнение буфера.Вам необходимо ограничить длину данных, считываемых в:

scanf("%14s", x);

В качестве альтернативы, вы можете указать scanf выделить буфер для вас:

char* x;
scanf("%as", &x);
...
checkArray(x, 15);

Это позволит выделить буфер достаточно долгодля любой строки вы даете это.(Конечно, ограничения на физическую память и плохие люди, отправляющие вашему приложению 10 ГБ данных).

Эта строка выделяется динамически, поэтому ее необходимо освободить:

free(x);
...