在输入字符串的单独行中打印每个单词

时间:2015-05-18 13:31:20

标签: c string char printf scanf

我在C中输入字符串的单独行中打印每个单词时遇到问题。我所做的作业中的问题表明:

  

以句子作为输入,并在单独的行中打印单词。

我的代码:

#include<stdio.h>

int main()
{
   int i;
   char s[100];

   scanf("%s", s);

   for(i=0; s[i]!='\0'; i++)
   {
      printf("%c", s[i]);

      if(s[i]==' ')
      {
         printf("\n");
      }
   }
}

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:4)

在您的代码中,

  printf("%s", s[i]); 

错了。将其更改为

 printf("%c", s[i]); 

因为,您正在尝试打印char值。 char的转化说明符为%c

注意:永远记住,使用错误的转化说明符会导致undefined behaviour

此外,在使用scan()进行%s时,您无法将整个空格分隔的输入读取为单个字符串。从手册页中,

  

%S

     

匹配一系列非空白字符;下一个指针必须是一个指向字符数组的指针,该指针足够长以容纳输入序列和终止空字节('\0'),它是自动添加的。 输入字符串在空格或最大字段宽度处停止,以先发生者为准。

您需要使用fgets()来完成这项工作。

那就是说,

  1. 正确缩进代码,使其易于阅读。
  2. Chnage scanf("%s", s);scanf("99%s", s);,以避免因输入的字符串长于99 char而导致缓冲区溢出。
  3. main()的正确签名是int main(void)

答案 1 :(得分:2)

Rookie,使用面向行的输入(如fgetsgetline)通常是阅读文本行的正确方法。然而,当对单个字符进行简单分割时,一次读取字符可能是有利的。

在您的情况下,如果您的任务是阅读最多100个字符的句子并在单独的行上打印出句子的单词,那么没有理由将该句子读入数组并存储单词。您可以简单地读取/打印每个字符,直到读取空格,然后打印newline而不是空格。阅读/打印一直持续到达到100个字符,遇到newlineEOF

#include <stdio.h>

#define MAXC 100

int main(void) {

    int c = 0;
    size_t n = 0;

    printf ("\n Enter a sentence.\n\n input: ");

    /* read up to 100 characters from stdin, print each word on a line */
    while (n < MAXC && (c = getchar ()) != EOF && c != '\n')
    {
        if (c == ' ')
            printf ("\n");
        else
            printf ("%c", c);
        n++;
    }
    printf ("\n");

    if (n == MAXC) /* read and discard remaining chars in stdin */
        while ((c = getchar ()) != '\n' && c != EOF);

    return 0;

}

使用/输出

$ ./bin/getchar_print_nl_space

 Enter a sentence.

 input: This is a sentence to split into words.
This
is
a
sentence
to
split
into
words.

注意:如果您要存储所有字符,最多100个(表示99个字符和1个空终止符),则需要将长度检查调整为n < MAXC - 1和然后null终止数组:

    char s[MAXC] = {0};

    /* read up to 99 characters from stdin into s */
    while (n < MAXC - 1 && (c = getchar ()) != EOF && c != '\n')
        s[n++] = c;

    s[n] = '\0';        /* null-terminate after last character  */

    if (n == MAXC - 1) /* read and discard remaining chars in stdin */
        while ((c = getchar ()) != '\n' && c != EOF);

然后,您将重复对空格进行逻辑检查并在newline循环中打印for

    for (c = 0; c < n; c++)
        if (s[c] == ' ')
            printf ("\n");
        else
            printf ("%c", s[c]);

了解输入方式,面向字符的输入和面向行的输入将节省您的时间,使您可以将正确的工具与情境相匹配。在这里,没有“更正确”或“更不正确”的方法,只是采用不同的方式。

答案 2 :(得分:0)

下面的代码是答案。 程序还计算空间/字符数和换行符。

http://cprograming-char-operation.blogspot.com/2018/07/for-given-statement-print-word-in-each.html

/* Program 1_12 */
/* Count number of line, space and char */
/* Replace a char with specific newline */
/* Add blank space in first input */
#include<stdio.h>

int main()
{
    int c,nl,nc,ns,nt;
    nl=nc=ns=nt=0;
    int d,r, prevd, prevr;
    printf("Enter which char to replace :: ");

    /* prev is stored before of \n */
    while((d = getchar()) != '\n' && (prevd = d));
    d = prevd;
    printf("Enter word below \n");
    while((c=getchar()) != EOF)
    {
        ++nc;
        if(c==' ')
            ++ns;
        if(c=='\n')
            ++nl;
        if(c=='\t')
            ++nt;
        /* Replace a char with A */
        if(c==d)
            putchar('\n');
        else
            putchar(c);
    }
    printf("total char=%2d, newline=%2d, space=%2d tabs=%2d\n",nc,nl,ns,nt);
    return 0;
}

/* Written by: Prakash Katudia <prakash.katudia@gmail.com> */

gcc ./my_code.c

./ a.out

输入要替换的字符:: :: #space#

在下面输入单词

你好 你好

如何

答案 3 :(得分:0)

我认为以更好的方式完成这项工作的另一种方法如下。

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

#define MAX_CHAR 100

int main() {

    char s[100],*c;
    int i = 0;

    scanf("%[^\n]", s);

    //Write your logic to print the tokens of the sentence here.
    for ( c = s; *c != (int)NULL; c++){

        if ( *c == ' '){
            *c = '\n';
        }
    }
    printf("%s",s);
    return 0;
}

答案 4 :(得分:0)

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

int main()
{
     char a[1000];          
     int i,len;                          

     scanf("%[^\n]s",a);
     len=strlen(a);

     for(i=0;i<len;i++)
     {
         if(a[i] !=' ')
         {
             printf("%c", a[i]);  
             printf("\n");
         }
     }
}