在c中将内容从一个数组复制到另一个数组

时间:2015-09-28 22:08:04

标签: c arrays

以下是我的计划到目前为止所做的概述。

虽然inputLine中有更多字词:

  • inputLine
  • 获取下一个字
  • 如果下一个单词适合inputline2
    • 将下一个字添加到inputline2(不起作用,可能不需要)
    • inputline2添加到outputBuffer(不起作用)
    • 格式outputBuffer

否则:

  • outputBuffer写入输出文件
  • 清空outputBuffer(将0放在位置0)

无论我尝试什么,outputline2和/或outputBuffer都不会正确复制inputline的内容。我inputline2的唯一原因是因为我最初使用fgets并将文本文件中的一行内容放入inputline。但是,由于我的数组长度假设为40,因此它总是将原始行中的一些单词切成两半。如果可以以某种方式避免这种情况,我甚至不需要inputline2。无论哪种方式,在这两种情况下,来自单词的内容(这只是来自原始inputline的单个单词)将无法正确复制。

void format(FILE *ipf, FILE *outf)
{
    char inputline[80];
    char outputBuffer[MaxOutputLine];
    char word[MaxOutputLine];

    while(fgets(inputline, 80, ipf) != NULL)
    {
        int pos = 0;
        int i;
        int j = 0;
        char inputline2[MaxOutputLine] = {'\0'};

        while(pos != -1)
        {
            i=0;
            pos = nextword(inputline, word, pos);

            if(strlen(word) <= (40 - strlen(inputline2)))
            {
                while(i < strlen(word))
                {
                    inputline2[j] = word[i];
                    i++;
                    j++;
                }
                j++;
                printf("%s", inputline2);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

由于我无法在评论中格式化代码,因此我将其作为答案发送。 首先,我猜你的nextword()类似于:

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

int nextword(char *inputline, char *word, int pos)
{
    char *ptr;
    int len;

    ptr = strchr(&inputline[pos], ' ');
    len = ptr ? ptr - &inputline[pos] : strlen(&inputline[pos]);
    strncpy(word, &inputline[pos], len);
    word[len] = 0;
    if (ptr == NULL)
        return -1;
    return pos + len + 1;
}

说清楚:

#define MaxOutputLine 40

在格式()中你错过了这一行:

    if(strlen(word) <= (40 - strlen(inputline2)))
    {
        while(i < strlen(word))
        {
            inputline2[j] = word[i];
            i++;
            j++;
        }
        inputline2[j] = ' ';/*missed, otherwise undefined, eg. \0 */
        j++;
        printf("%s", inputline2);
    }

某些编译器在堆栈上存在长缓冲区问题。您可以尝试添加&#34;静态&#34;在char buf []格式()之前。

在nextword()中你有错误:

  if(pos1 == '\n' || pos1 == '\0')
    {
      return -1;
    }

而不是

if(inputline[pos1] == '\n' || inputline[pos1] == '\0')
{
  word[pos2]='\0';
  return -1;
}

在我看来,nextword()可以简化为类似的东西:

int nextword(char *inputline, char *word, int pos1)
{
  int pos2 = 0;

      while(inputline[pos1] != ' ' && inputline[pos1] != '\n' && inputline[pos1] != '\0')
        {
          word[pos2] = inputline[pos1];
          pos1++;
          pos2++;
        }
      word[pos2]='\0';
      if(inputline[pos1] == '\n' || inputline[pos1] == '\0')
        {
          return -1;
        }

   return pos1 + 1;
}

答案 1 :(得分:0)

int nextword(char *inputline, char *word, int pos1)   //takes a word beginning from pos and puts it in word and re\
turns the new position of beginning of the next word
{
  int pos2 = 0;

  if(inputline[pos1] == '\0')
    {
      return -1;
    }

  if(inputline[pos1] == ' ')
    {

      while(inputline[pos1] == ' ')
        {
          pos1++;
        }
    }
  else
    {
      while(inputline[pos1] != ' ' && inputline[pos1] != '\n' && inputline[pos1] != '\0')
        {
          word[pos2] = inputline[pos1];
          pos1++;
          pos2++;
        }
      if(pos1 == '\n' || pos1 == '\0')
        {
          return -1;
        }
      pos1++;
    }
  word[pos2]='\0';

   return pos1;
}