Очевидно, что вам трудно понять использование функций пользовательского ввода и общую логику вашей программы.Как вы думаете, что делает следующее:
printf("Enter a sentence: \n");
fgets(str, 100, stdin);
if (fgets(str, 100, stdin) == NULL) {
...
Сколько предложений ожидается от пользователя?Вызов fgets
дважды не является тем, что вы намереваетесь - достаточно одного раза (удалите тот, на котором вы не можете проверить возврат) Хотя дублирование вызова fgets
было не тем, что вам нужно, использование fgets
для пользователя-вход был правильным выбором.
(также примечание: не возвращает отрицательные значения в вашу оболочку, например, return -1;
, вместо этого просто возвращает 1
, чтобы указать состояние ошибки (илимакрос EXIT_FAILURE
, представленный в stdlib.h
, который, как ни странно, определяется как 1
)
Пока мы говорим об определенных константах, избегайте использования магических чисел в вашем коде (например, в char str[100];
, 100
- это магическое число ). Вместо этого:
#define MAXC 100 /* if you need a constant, #define one (or more) */
...
char str[MAXC] = "";
Поскольку вы объявляете str
как массив 100
символов, вы знаете,что вам не нужно запрашивать ввод символа для добавления, если у вас уже есть строка 99 chars
плюс символ , заканчивающийся нулем . Поэтому вам нужно сохранить длину строки. Ваше использованиеstrcspn
- это хороший способ обрезать триал '\n'
с str
, но вы уже сканируете вперед в str
, чтобы найти '\n'
и nul-terminate строку там -- и - strcspn
возвращает количество символов начального сегмента str
, которое не включает '\n'
(т.е. он вернет длину, поэтому просто сохраните ее)
str[(len = strcspn(str, "\n"))] = 0; /* save len */
Остальная часть кода просто проверяет len < MAXC - 1
, чтобы убедиться, что имеется достаточно места для добавления символа, изатем предложите и наберите getchar
, добавьте новый символ в str[len]
и затем nul-terminate str
снова в len+1
.Вы можете сделать что-то похожее на:
if (len < MAXC - 1) {
printf ("\nEnter character to add: ");
if ((r = getchar()) != EOF) {
str[len++] = r;
str[len] = 0;
printf ("This is the sentence: '%s' (len: %zu)\n", str, len);
}
else
fputs ("(user canceled input.)\n", stderr);
}
else {
fputs ("\nerror: insufficient space to add char.\n", stderr);
return 1;
}
( примечание: , увеличивая len
при добавлении нового символа, вы сохраняете длину новой строки в len
ипри необходимости он сохраняется для последующего использования.)
Если положить его в целом, вы получите что-то вроде следующего:
#include <stdio.h>
#include <string.h>
#define MAXC 100 /* if you need a constant, #define one (or more) */
int main (void) {
char str[MAXC] = "";
size_t len;
int r;
printf("Enter a sentence: "); /* no newline needed */
if (fgets(str, MAXC, stdin) == NULL) {
fputs ("fgets failed\n", stderr); /* no need for fprintf */
return 1; /* do not return negative values to your shell */
}
str[(len = strcspn(str, "\n"))] = 0; /* save len */
printf ("This is the sentence: '%s' (len: %zu)\n", str, len);
if (len < MAXC - 1) {
printf ("\nEnter character to add: ");
if ((r = getchar()) != EOF) {
str[len++] = r;
str[len] = 0;
printf ("This is the sentence: '%s' (len: %zu)\n", str, len);
}
else
fputs ("(user canceled input.)\n", stderr);
}
else {
fputs ("\nerror: insufficient space to add char.\n", stderr);
return 1;
}
}
(просто примечание, если вы не предоставляете конвертацию в течениеВаша строка формата вывода, например, %s
или %d
и т. д., тогда нет необходимости вызывать printf
или fprintf
. Вы можете просто вызвать puts
или fputs
, чтобы вывести буквальную строку.Хороший компилятор сделает эту оптимизацию для вас.)
Пример использования / Вывод
$ ./bin/straddchr
Enter a sentence: 123456
This is the sentence: '123456' (len: 6)
Enter character to add: 7
This is the sentence: '1234567' (len: 7)
(и если вы изначально вводите 99
строку символов, выне будет предложено ввести дополнительный символ, и отобразится сообщение об ошибке "insufficient space to add char."
)
Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.