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](https://i.stack.imgur.com/IkI9u.png)
#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;
}