2015-01-09 3 views
0

Мне нужно написать программу, которая печатает свой ввод по одному слову в строке. Вот что я получил до сих пор:печатать слово в строке

#include <stdio.h> 
main(){ 
    int c; 
    while ((c = getchar()) != EOF){ 
     if (c != ' ' || c!='\n' || c!='\t') 
      printf("%c", c); 
     else 
      printf("\n"); 
    } 
} 

Логика довольно проста. Я проверяю, не является ли вход не новой строкой, вкладкой или пробелом, и в этом случае он печатает ее, иначе печатает новую строку.

Когда я запускаю его, я получаю результаты, как это:

input--> This is 
output--> This is 

Он печатает все дело. Что здесь не так?

+0

Посмотрите на 'putchar'. ('printf' is * not * единственный способ распечатать вещи, а иногда и не самый лучший.) Также спросите себя, что происходит, когда слова имеют более одного пространства между ними. – rici

+0

Возможно, вы захотите проверить 'scanf' (или' fscanf') для ввода. Он знает, как пропустить пробелы и дать вам следующее слово. – cHao

+1

Предложите 'while ((c = getchar())! = EOF) {if (! Isspace (c)) {printf ("% c ", c); else ... ' – chux

ответ

7

if (c != ' ' || c!='\n' || c!='\t') Это никогда не будет ложным.

Возможно, вы имели в виду: if (c != ' ' && c!='\n' && c!='\t')

0

вы можете использовать, если вы хотите strtok функцию в string.h библиотеки, которая может сократить вклад в многих слов, обеспечивая разделитель.

Вот совершенный код комментировал, который может соответствовать вашим потребностям

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

int main(int argc, char *argv[]) 
{ 
    char line[1000]=""; // the line that you will enter in the input 
    printf("Input the line:\n>>"); 
    scanf("%[^\n]",line); // read the line till the you hit enter button 
    char *p=strtok(line," !#$%&'()*+,-./'"); // cut the line into words 
    // delimiter here are punctuation characters (blank)!#$%&'()*+,-./' 

    printf("\nThese are the words written in the line :\n"); 
    printf("----------------------------------------\n"); 
    while (p!=NULL) // a loop to extract the words one by one 
    { 
     printf("%s\n",p); // print each word 
     p=strtok(NULL," !#$%&'()*+,-./'"); // repeat till p is null 
    } 

    return 0; 
} 

Если мы выполняем код, приведенный выше, мы получим

Input the line: 
>>hello every body how are you ! 

These are the words written in the line : 
---------------------------------------- 
hello 
every 
body 
how 
are 
you 
+0

Если пользователь вводит '' \ n "', 'line' не инициализируется, и код продолжает неопределенное поведение. – chux

+0

источник неопределенного поведения, пожалуйста! –

+0

Я сказал это прямо здесь: «Если пользователь вводит« \ n », строка не инициализируется». С 'line' в неопределенном состоянии' strtok (строка ... 'приводит к UB. Как вы думаете, что происходит с' line', когда пользователь вводит '' \ n "?? – chux

0
suggest the code implement a state machine, 
where there are two states, in-a-word and not-in-a-word. 
Also, there are numerous other characters that could be read 
(I.E. ',' '.' '?' etc) that need to be check for. 

the general logic: 

state = not-in-a-word 
output '\n' 

get first char 
loop until eof 
    if char is in range a...z or in range A...Z 
    then 
     output char 
     state = in-a-word 
    else if state == in-a-word 
    then 
     output '\n' 
     state = not-in-a-word 
    else 
     do nothing 
    end if 
    get next char 
end loop 

output '\n' 
1

вместо использования PRINTF попробовать putchar, также как указано выше, вы должны использовать & & вместо ||.

вот мой код-

#include<stdio.h> 

main() 
{ 
    int c, nw;     /* nw for word & c for character*/ 

    while ((c = getchar()) != EOF){ 

    if (c != ' ' && c != '\n' && c != '\t') 
    nw = c; 
    else { 
     nw = '\n'; 
    } 

    putchar (nw); 

    } 

} 

этот код даст вам желаемый результат

0

Я думаю, простое решение было бы как

#include <stdio.h> 

int main(void) { 
    // your code goes here 
    int c; 
    while((c=getchar())!=EOF) 
    { 
     if(c==' ' || c=='\t' || c=='\b') 
     { 
      printf("\n"); 
      while(c==' ' || c=='\t' || c=='\b') 
      c=getchar(); 
     } 
     if(c!=EOF) 
     putchar(c); 
    } 
    return 0; 
}