以单独的行打印每个单词

时间:2017-04-29 20:27:01

标签: c

我的计划旨在将单词中的每个单词打印在一个单独的行上。但我应该用%s而不是%c 打印它!我已经尝试实现它,但该程序没有给我一个正确的输出!我的想法是当你找到空字符 1-打印单词  2-将temp数组的索引返回0并存储一个新单词

 int main () {
    char sen[100];
    char cpy [100];
    printf("Entter a sentence "); 
    gets(sen);
    int len = strlen(sen);
    int i = 0; 
    int k =0;
    for (i=0 ; i<len;i++) 
    {
       if (sen[i]!='\0')
       {
          cpy[k++]+=sen[i];
       }
       else{
          printf("%s\n",cpy);
          k=0;}
    }

 }

3 个答案:

答案 0 :(得分:2)

你混淆了空字符和空格字符。空字符\0代表“字符串结尾”:strlen函数返回第一个\0之前的字符数。

在您的forloop中,您希望显示由分隔的每个单词,因此您必须使用字符而不是\0进行测试。

另外,要正确显示字符串,您必须使用\0字符结束字符串。因此,在printf指令之前,您必须cpy[k] = '\0';

答案 1 :(得分:0)

如朱利安·韦尔奈所指出的,

if (sen[i]!='\0')将永远是真实的,你需要if (sen[i]!= ' ')代替if (sen[i]!='\0'),因为单词之间有空格来分隔它们。

同样在cpy[k++]+=sen[i];您要将sen[i]添加到cpy[k++]哪个接缝很奇怪,我认为您需要的是cpy[k++] = sen[i];

修改你的循环如下......

for (i=0 ; i<len; i++) {
   int flag = 0;
   while(sen[i] == ' ') i++; // multiple spaces

   while(sen[i] != ' ' && sen[i] != '\0') {
      cpy[k++] = sen[i];
      flag = 1;
      i++;
   }
   if(flag) {
     cpy[k] = '\0';
     printf("%s\n",cpy);
     k=0;
   }
}

答案 2 :(得分:0)

你不必费心去复制 - 你需要做的就是用新线代替空格。所以这是执行此操作的代码:

#include <stdio.h>

int main()
{
   char sen[100];
   bool last_char_space = true;
   printf("Please enter a sentence: ");
   fflush(stdout);
   fgets(sen, 100, stdin);;
   for (int loop = 0; sen[loop]; ++loop) { // send[loop] is true until end of string - saves repeatedly calling strlen
     if (send[loop] == ' ') { // A space
       if (last_char_space) { // Last character not a space, put new line
         fputc('\n', stdout);
       }
       last_char_space = true; // Record the fact that we are between words
     } else {
       fputc(sen[loop], stdout); // Not a space - print it
       last_char_space = false;  // We are working on a word
     }
   }
   return 0;
}