Я работал над некоторыми книгами на C, пытаясь получить мои C-ноги (морские ноги! Получите это ?!). Я только что закончил упражнение 1-9 из книги K & R, которая для справки - «написать программу для копирования ее ввода на свой вывод, заменив каждую строку одного или нескольких пробелов на один пробел». У меня есть вопрос о том, что происходит с моим кодом, though--K & R Упражнение 1-9: вывести вход, заменив несколько заготовок на одну заготовку
#include <stdio.h>
//Copy input to output. Replace each string of multiple spaces with one single space
int main(int argc, char *argv[]){
int ch, lch; // Variables to hold the current and last characters, respectively
/* This loop should 'put' the current char, then store the current char in lc,
* loop back, 'get' a new char and check if current and previous chars are both spaces.
* If both are spaces, do nothing. Otherwise, 'put' the current char
*/
for(ch = getchar(); (ch = getchar()) != EOF; lch = ch){
if(ch == ' ' && lch == ' ')
;
else putchar(ch);
}
return 0;
}
В основном, это работает, для первого ввода символа, за исключением. Например, если первая строка ввода
"This is a test"
мой код выхода
"his is a test".
После падения самого первого ввода символов, программа работает стабильно, чтобы удовлетворить требования упражнение в.
Может кто-нибудь дать мне представление об ошибке, которую я совершил в своей петле, которая вызывает проблему? Любые другие советы приветствуются.
Примечание, вы используете 'lch' в теле цикла, даже если он не инициализирован до * после * первой итерации цикла. Рассмотрите возможность включения предупреждений в своем компиляторе, вероятно, обнаружит и предупредит об этой проблеме, чтобы вы могли ее исправить. – hyde
Незначительный комментарий к стилю кодирования: Сохраните 'for()' для циклов, которые увеличивают некоторый указатель/указатель на фиксированную сумму. Здесь вызывается цикл while(). – chux
Действительно ли это раздражает предположить, что было бы полезно указать более конкретно то, что называет «книга K & R», а также что название вопроса было бы лучше, если бы он дал понять какой-то аспект того, что касается вопроса (в прямой смысл - поскольку проблема в значительной степени не зависит от ее источника, а кто-то, кто знает C и может дать хороший ответ, но не слышал о «книге K & R», может пропустить вопрос)? – jfhc