2013-03-10 11 views
3

Я создаю абсурдно простую программу на C, чтобы побеседовать с getchar(). Программа распечатает то, что вы вводили, пока не нажмете enter, и это гарантирует, что ваши линии не превышают 80 символов. Чтобы сделать это, я продолжаю подсчитывать, сколько символов было введено. После того, как количество символов достигнет 70, следующее обнаруженное пространство вызовет разрыв строки. Если между 70-80 не встречается пробел, разрыв строки будет происходить независимо. Я понимаю, что это супер наивная реализация и может быть оптимизирована влево и вправо, но помните, я просто бездельничал:Проверьте, не является ли символ пробелом

while ((c = getchar()) != '\n') { 
    if (lineLengthCount < 70) { 
     putchar(c); 
     lineLengthCount++; 
    } 
    else if (lineLengthCount < 80 && (c == ' ')) { 
     printf("%c\n", c); 
     lineLengthCount = 0; 
    } 
    else { 
     printf("%c\n", c); 
     lineLengthCount = 0; 
    } 
} 

Проблема заключается в c == ' ' условно не кажется, на самом деле проверка пространства , Я получаю такой вывод:

fitter happier more productive comfortable not drinking too much regula 
r exercise at the gym three days a week getting on better with your ass 
ociate employee contemporaries at ease eating well no microwaved dinner 

, где я надеялся, что линии будут усечены, когда пространство встречались. Вместо этого, независимо от того, какой символ вводится после строки 70, создается новая строка. я что-то упускаю? Действительно ли это означает любой персонаж?

+0

Оба последних блока, похоже, делают то же самое. – cnicutar

+0

Даже если условие в вашем else-if ложно, ваше else выполнит и пометит разрыв строки. – Metabble

+0

И если 'LineLengthCount'' 70' ...? вы сбросите его на '0'. –

ответ

5
while ((c = getchar()) != '\n') { 
    if (lineLengthCount < 70) { 
     putchar(c); 
     lineLengthCount++; 
    } 
    else if (lineLengthCount < 80 && (c == ' ')) { 
     printf("%c\n", c); 
     lineLengthCount = 0; 
    } 
    else if (lineLengthCount >= 80){ 
     printf("%c\n", c); 
     lineLengthCount = 0; 
    } 
    else{ 
     putchar(c); 
     lineLengthCount++; 
    } 
} 

Я думаю, что это должно сработать. Это должно препятствовать выполнению else, когда число символов меньше 80, но символ не является пробелом.

EDIT: Теперь я понял, что вместо того, чтобы lineLengthCount меньше 80, но символ не является пространством, он вообще не будет печататься, поэтому я добавил еще один в конце, чтобы исправить его.

Разве это не было бы короче и кратким?

while ((c = getchar()) != '\n') { 
    putchar(c); 
    if((c == ' ' && lineLengthCount >= 70) || lineLengthCount >= 80){ 
     printf("\n"); 
     lineLengthCount = 0; 
    } 
    else 
     ++lineLengthCount; 
} 
+0

Несущие символы между 70-м и 80-м позициями будут потеряны! –

+0

@ MártonMolnár Я понял, что, как вы это сказали. xD Это работает? – Metabble

4

У вас возникли проблемы с вашими условиями: если lineLengthCount> 70, но следующий символ не является пробелом, последние else будут поражены, сломаны и сбросят счетчик.

1

Если вы совсем не уверены в том, что происходит, я бы рекомендовал ломки «если» условно на три явных проверок:

while ((c = getchar()) != '\n') { 
    lineLengthCount++; 
    if (lineLengthCount < 70) { 
     putchar(c); 
    } 

    if (lineLengthCount < 80 && (c == ' ')) { 
     printf("%c\n", c); 
     lineLengthCount = 0; 
    } 

    if (lineLengthCount == 80) { 
     printf("%c\n", c); 
     lineLengthCount = 0; 
    } 
} 

Если вы хотите увидеть, что происходит, писать какой-то отладочный вывод в каждом «if», чтобы заметить, когда он вызывается.

После того, как это работает, и вы поймете, почему, вы можете изменить его и объединить «если» ...

1

Использование «» вполне справедлива. Вы также можете попробовать использовать стандартную библиотечную функцию C isspace(), чтобы проверить, является ли символ пробелом. Эта функция возвращает логическое выражение, как и в:

char ch = '0'; 

if (isspace(ch)) 
    //the char is a space... 

К «пространство» эта функция фактически означает любой «пробел» характер, так что включает в себя «\ п» или любой другой символ, который печатает, как пустое пространство.

Вы могли бы также десятичное значение 32, которое означает то же самое, как пространство:

if (ch==32) 

Однако для удобства чтения я предпочел бы использовать первый вариант!

Смежные вопросы