以下是我的计划到目前为止所做的概述。
虽然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);
}
}
}
}
答案 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;
}