在单词之间拆分字符串并插入换行符

时间:2015-01-14 09:01:54

标签: c arrays string split

我有一个由几句话组成的字符串。 例如:

 hello world bye bye

现在,我需要将这句话变成一句话:

hello
world
bye
bye

我有这个想法,但我不知道如何写得正确,所以我是跳跃ypu家伙可以帮助我。 这就是我到目前为止所做的:

int len=0, k=0, stopatspace=0;
char temptext[100][15]={0};
char line[300]={0};

   len=strlen(line);
   printf("len is: %d", len);
   for(k=0; k<len; k++)
   {
       if (k == ' ')
       {
           // i dont know what to write here in order to make it a cloumn 
       }
   }
基本上,我的想法是在我的线路的所有长度上运行,当我到达一个空间时,我希望它进入(向下移动一行,使它看起来像一个库仑)

4 个答案:

答案 0 :(得分:0)

假设line是包含char的{​​{1}}数组,hello world bye bye被声明为

text

并且您希望将每个单词复制到char text[100][15]; //I used 100 and 15 because your example contains it 的每一行中。然后,使用带有text(空格)的strtok()函数作为分隔符,并将其置于循环中,当" "返回strtok()以获取每个单词时,该循环终止。使用循环中的strcpy()将每个单词复制到NULL的每一行。

此代码如下所示:

text

现在,要打印它,您可以使用

char text[100][15];
char line[]="hello world bye bye";
int i=0;

char *token=strtok(line," ");

while(token!=NULL)
{
  strcpy(text[i],token);
  i++;
  token=strtok(NULL," ");
}

<小时/> 另一种方法是手动复制每个字符,直到看到空格。

for(int j=0;j<i;j++)
  printf("text[%d]=%s",j,text[j]);

请注意,上述代码不会阻止buffer overflows。您可以使用

打印每个单词
int len=strlen(line);
int i=0;
int k=0;

for(int j=0;j<len+1;j++)
{
  if(line[j]==' ')
  {
    text[i][k]='\0';
    i++;
    k=0;
  }
  else
  {
    text[i][k]=line[j];
    k++;
  }
}

答案 1 :(得分:0)

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

int main(int argc, char *argv[])
{
        char string[100];
        fgets(string, 100, stdin);
        string[strlen(string)-1] = 0;

        // create an array of pointers
        char **string_array = (char**)malloc(sizeof(char*));

        int i = 0, array_size;

        // tokenize input
        char *token = strtok(string, " ");
        while(token!=NULL) {
                // dynamically increase the array during run time
                string_array = (char**)realloc(string_array, (i+1)*sizeof(char**));
                // create the string as you would do when there is only one string
                string_array[i] = (char*)malloc(strlen(token)+1);
                strcpy(string_array[i], token);
                token = strtok(NULL, " ");
                i++;
        }
        array_size = i;

        for(i=0; i<array_size; i++) {
               printf("%s\n", string_array[i]);
        }

        return 0;
}

基本上你创建了一个指针数组,你就像在只有一个字符串时那样逐个分配字符串的内存。 (如果令牌数量未知,请使用realloc增加指针指针的大小。)

答案 2 :(得分:0)

#include <stdio.h>
#include <ctype.h>

int main(void){
    char line[300] = "hello world bye bye\n";
    char temptext[100][15]={0};
    int i=0, j, k=0;

    while(line[k]){
        if(isspace(line[k])){
            ++k;//skip space to word
            continue;
        }
        for(j=0; j < 15-1 && line[k] && !isspace(line[k]); ++k, ++j)
            temptext[i][j] = line[k];
        if(j && ++i == 100)
            break;
    }
    for(j=0; j<i; ++j)
        puts(temptext[j]);
    return 0;
}

答案 3 :(得分:-1)

#include<stdio.h>
#define NEWLINE printf("\n")
int main(void)
{
        char string[]="hello world bye bye";
        int index=0;
        while(string[index])
        {
                if(string[index]==32)
                {
                        NEWLINE;
                        index++;
                }
                else
                {
                        printf("%c",string[index]);
                        index++;
                }
        }
        NEWLINE;
}

// Whenever i encountered with a space, i am printing a new line on the screen. Here 32       is the ASCII value for space