我有一个文件test.txt,如下所示:
5 6
sugli*
odiati
tiri*n
tri*cd
oe*poi
前两个数字是必须放置所有这些单词的数组维度。
以下任务的代码是( fileIn 是 test.txt 文件):
int row, col;
fscanf(fileIn, "%d %d%*c", &row, &col);
int cruciverba[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cruciverba[i][j] = fgetc(fileIn);
}
char space = fgetc(fileIn);
}
现在创建了数组。现在我应该写一个函数(或更多)将字符串写入另一个文件,但不是数组中的每个字符串,只是水平和垂直长度> = 2的字符串。请注意,'*'
是字符串分隔符。
目标是有一个包含这些字符串的output.txt文件:
sugli
odiati
tiri
tri
cd
oe
poi
sotto
udire
giri
lai
it
co
indi
我知道如何输出字符串,但我不知道如何解决问题。有什么建议吗?
答案 0 :(得分:0)
#define TRIGGER '*'
void out(FILE *fileOut, char *buff, int value){
//this function is output buffer
static int pos = 0;
if(value == TRIGGER){
buff[pos] = '\0';
if(pos >= 2)
fprintf(fileOut, "%s\n", buff);
pos = 0;
} else {
buff[pos++] = value;
}
}
...
//在主
FILE *fileOut = fopen("out.txt", "w");
int side[2] = {row, col};
for(int s = 0; s < 2; ++s){
char buff[side[s]+1];
*buff = 0;
for (int i = 0; i < side[s]; i++) {
for (int j = 0; j < side[1-s]; j++) {
out(fileOut, buff, s ? cruciverba[j][i] : cruciverba[i][j]);
}
out(fileOut, buff, TRIGGER);
}
fprintf(fileOut, "\n");
}
fclose(fileOut);
答案 1 :(得分:0)
此问题旨在折磨您的多个级别。从面向字符的输入,字符数组到字符串理解,数组索引,文本文件格式以及许多其他细微问题,这旨在迫使您专注于逐个字符级别。
首先,您的数据文件包含数组边界,后面跟5-rows
个7-characters
(您必须考虑终止每一行的'\n'
字符)。您的数组存储空间为5-row
6-col
。这意味着从面向字符的输入角度来看,您必须考虑'\n'
的读取,同时从数据/索引的角度忽略它。
(注意:虽然问题的意图似乎让您读入2D数组,但您也可以将row*col
字符读入1D数组中 - 这种方法并非没有挑战)
在将读取导航到数组后,您将面临输出数组,同时仅考虑[A-Za-z]
(alpha
)个字符作为每行的一部分,'*'
个字符作为'\n'
以及每行的结尾也是'\n'
。
没有简单或正确的方法来解决这个问题。无论你怎么做,这都是你必须真正专注于索引体操以达到提供正确输出的例程的地方。下面的方法使用7-char
缓冲区和缓冲区索引来缓冲每个所需的char,并在满足所有条件时将缓冲区写入stdout
(例如'*'
或结束时到达行)。下面是一个解决问题的方法的注释示例。我已经离开了操纵你的第二部分,但是通过这里提供的示例和BLUEPIXY,你有几个例子表明你必须处理索引。例如:
#include <stdio.h>
#include <ctype.h>
int main (int argc, char **argv) {
int row, col, i, idx, j, c;
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
row = col = i = idx = j = c = 0; /* initialize all values */
/* validate row and col data read */
if (fscanf (fp, "%d %d%*c", &row, &col) != 2) {
fprintf (stderr, "error: invalid read of row/col.\n");
return 1;
}
char cruciverbal[row][col]; /* variable length array to data */
char buf[col+1]; /* buffer to assist in printing */
for (i = 0; i < row; i++) { /* for each row in array */
for (j = 0; j < col; j++) { /* for each char in row */
if ((c = fgetc (fp)) == EOF) /* jump if EOF */
goto readdone;
else {
cruciverbal[i][j] = c; /* store char in array */
}
}
fgetc (fp); /* discard newline in file */
}
readdone:
if (fp != stdin) fclose (fp); /* close file if not stdin */
/* print characters to stdout */
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (isalpha (cruciverbal[i][j])) /* if [A-Za-Z] */
buf[idx++] = cruciverbal[i][j]; /* buffer char */
else {
if (idx > 1) { /* check if buffer > 1 */
buf[idx] = 0; /* nul-terminate buffer */
printf ("%s\n", buf);
idx = 0; /* reset buffer index */
}
else { /* if buf < 2, print \n */
fputc ('\n', stdout);
continue;
}
}
} /* if last char in row is [A-Za-z] */
if (isalpha (cruciverbal[i][j-1])) {
if (idx > 1) {
buf[idx] = 0; /* nul-terminate buffer */
printf ("%s\n", buf);
}
else if (idx == 0) /* if buffer empty */
fputc ('\n', stdout); /* output newline */
}
idx = 0; /* reset buf index */
}
return 0;
}
使用/输出强>
$ ./bin/cruciverbal <../dat/56array.txt
sugli
odiati
tiri
tri
cd
oe
poi
查看这两个答案,如果您有任何疑问,请告诉我们。