Куда я обращаюсь к памяти, которой я не владею?(массив символов) - PullRequest
0 голосов
/ 11 октября 2018

Цель этой программы - напечатать каждое слово в отдельной строке с номером строки и словом.Он прекрасно компилируется без предупреждений, но мне кажется, что я обращаюсь к памяти, которой я не владею, поскольку я получаю Abort trap:6, но я не знаю, где и почему.Я посмотрел другие вопросы с той же ошибкой, но ответы там не помогли.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int word = 1, line = 1, a = 0;
    char str[1], w[70];
    strcpy(w, " ");
    while (a != EOF)
    {
        a = getchar();
        if ((a != EOF) && (a == ' ' || a == '\t' || a == '\n'))
        {
            ++word;
            if (a == '\n')
                ++line;
        }
        if (a != EOF && a != ' ' && a != '\t' && a != '\n')
            sprintf(str, "%d", a);
        strcat(w, str);
        if (a == ' ' || a == '\t' || a == '\n' || a == EOF)
        {
            printf("\n %d.%d%s", line, word, w);
            strcpy(w, " ");
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 11 октября 2018

char str[1] не может содержать строки длиной более 0, поскольку определение строк C представляет собой массив символов, оканчивающихся на один нулевой символ.Следовательно, ваш массив str должен иметь размер 2 байта, чтобы он содержал как минимум один char и 1 нулевой символ ('\0').Это, скорее всего, то, что вас беспокоит.

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

char str[1] -> char str[2]

Размер должен быть не менее 2, чтобы вместить как символ, так и символ с нулевым символом в конце (\0).

sprintf(str, "%d", a) -> sprintf(str, "%c", a)

Вы форматировали свой символ как int, следовательно, почему вы получали числа вместо текста, когда позже объединяли строку.

Наконец, ваш последний символ печатался дважды из-за этого:

if (a != EOF && a != ' ' && a != '\t' && a != '\n')
    sprintf(str, "%c", a);
strcat(w, str);

strcat(w, str); не входит в область проверки EOF, поэтому он объединяет последний символв любом случае.

Выход:

enter image description here

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

int main() {
    int word = 1, line = 1, a = 0;
    char str[2], w[70];
    strcpy(w, " ");
    while (a != EOF) {
        a = getchar();
        if ((a != EOF) && (a == ' ' || a == '\t' || a == '\n')) {
            ++word;
            if (a == '\n')
                ++line;
        }
        if (a != EOF && a != ' ' && a != '\t' && a != '\n') {
            sprintf(str, "%c", a);
            strcat(w, str);
        }
        if (a == ' ' || a == '\t' || a == '\n' || a == EOF) {
            printf("%d.%d%s\n ", line, word, w);
            strcpy(w, " ");
        }
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...