- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编辑我作为输入文件收到的矩阵中的分号,但我似乎无法取得任何进展。我在 main 中使用 while 循环来确定矩阵的维度,因为程序需要能够处理不同大小的矩阵。我确实知道它永远是一个方阵。我认为我的问题出在 read_file 函数中。我可以从文件中读取矩阵并将其打印到终端,但我无法删除分号。我尝试了几种不同的方法,包括 strtok
,但最终总是得到垃圾数据。以下代码将读入输入文件并 printf 到终端,没有错误或警告,但它包含我需要删除的分号。这是我的代码:
void read_file(int *rows_p, int *columns_p, char matrix[*rows_p][*rows_p], char *file[]){
FILE *file_in;
file_in = fopen(file[1], "r");
/*Please not that the next few declarations and nested loops are commented out. I thought I should show this failed attempt.*/
/*char temp[*rows_p];
int new_col = (*columns_p + 1) / 2;
int i = 0;
int j;
int k;
while(fgets(temp, *columns_p, file_in) != NULL){
int ii = 0;
for(j = 0; j < *columns_p; j += 2){
if((temp[i] == '1') || (temp[i] == '0')){
matrix[i][ii] = temp[j];
ii++;
}
}
printf("%s", matrix[i]);
i++;
}
printf("\n");
*/
char temp[*rows_p][*columns_p];
int i = 0;
int j;
int k;
while(fgets(temp[i], *columns_p, file_in) != NULL){
for(j = 0; j < *columns_p; j++){
if((temp[i][j] == '1') || (temp[i][j] == '0')){
strcpy(matrix[i], temp[i]);
}
}
printf("%s", matrix[i]);
i++;
}
fclose(file_in);
}
这是输入文件中的内容(输入文件是 .csv):
0;0;0;0;0;0
0;0;0;1;0;0
0;1;0;1;0;0
0;0;1;1;0;0
0;0;0;0;0;0
0;0;0;0;0;0
这最终将用于生命游戏程序,但我发现自己无法删除分号。我以前做过类似的编辑,但我似乎无法弄清楚这一点。非常感谢您的帮助。
我想要实现的输出是,
000000
000100
010100
001100
000000
000000
我希望这是操作矩阵的最简单的形式。
最佳答案
虽然使用 fgets
和面向行的方法来分隔 .csv
文件中的值没有任何问题,但您可能会发现面向字符的方法有点问题一开始就更直观。
无论哪种情况,您都不应该将测试限制为 '0'
或 '1'
字符,因为 2-9
也可以组成任意数字。使用 ctype.h
中的 isdigit
对数字进行通用测试可以处理所有值。
无论您使用面向行还是面向字符的方法,目标都是相同的,您将在每个数字的开头找到行中的位置并调用 strtol
(或strtoul
或 strtod
(视情况而定)将数字字符串转换为数值,或者一次缓冲数字一个字符并在缓冲区上调用转换函数。 (实现转换调用由您完成)
在这里,分离值似乎是当前的绊脚石。采用面向字符的方法可能会有所帮助,那就是建立对一次处理一串字符、测试并根据当前字符采取正确操作的理解。从文件读取的角度来看,这再简单不过了,只需打开文件并一次读取一个字符,直到到达文件末尾和 EOF
。
一次循环一个字符,您需要跟踪当前的读取状态(我读取的是数字还是分隔符?)您的列计数基于从数字到分隔符的转换(或 '\n'
或 EOF
)。您的行计数基于'\n'
或EOF
)。然后,只需验证每行(对于矩阵)具有相同数量的值,并且当读取完成时,行数与列数相同。 (您还应该确保同时处理任意两个分隔符——这由您决定)
一个用于从文件中解析矩阵的面向字符读取的简短示例可以按如下方式完成,而无需将自己限制为 '0'
和 '1'
,
#include <stdio.h>
#include <ctype.h>
int main (int argc, char **argv) {
int c, /* char read from file */
rows = 0, /* matrix rows */
cols = 0, /* matrix cols */
nvals = 0, /* values per row count */
havedigit = 0; /* flag - reading digits - 1 */
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;
}
for (;;) { /* loop until EOF */
c = fgetc(fp); /* get a character */
if (isdigit(c)) { /* test if digit */
havedigit = 1; /* set havedigit flag */
putchar (c); /* output char */
} /* end-of-row or end-of-file */
else if (c == '\n' || c == EOF) {
if (havedigit) { /* prev char read was digit */
nvals++; /* increment value count */
putchar ('\n'); /* output newline */
}
if (c == EOF) /* if EOF - bail */
break;
if (rows == 0) /* if first row, set cols */
cols = nvals;
else if (nvals != cols) { /* validate no. of cols */
fflush (stdout); /* output any bufferd chars */
fprintf (stderr, "\nerror: not a valid matrix.\n");
return 1;
}
rows++; /* increment row count */
nvals = 0; /* reset value per row count */
havedigit = 0; /* set digit flag to zero */
}
else { /* we have a separator */
if (havedigit) /* if last was digit */
nvals++; /* increment value per row */
havedigit = 0; /* set digit flag to zero */
}
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
if (rows != cols) { /* validate rows == cols for sq. matrix */
fprintf (stderr, "error: not a square matrix.\n");
return 1;
}
return 0;
}
解析文件的方法有很多很多。使用多种方法将帮助您识别哪种方法最适合每种类型的解析问题。
示例输入文件
$ cat dat/matrix.csv
0;0;0;0;0;0
0;0;0;1;0;0
0;1;0;1;0;0
0;0;1;1;0;0
0;0;0;0;0;0
0;0;0;0;0;0
$ cat dat/matrix2.csv
0;0;0;0;0;0;1;0
0;0;0;1;0;0;0;1
0;1;0;1;0;0;1;0
0;0;1;1;0;0;0;1
0;0;0;0;0;0;1;1
0;0;0;0;0;0;0;0
1;1;1;0;0;1;1;1
0;0;0;1;1;0;0;0
示例使用/输出
$ ./bin/getchar_parse_matrix <dat/matrix.csv
000000
000100
010100
001100
000000
000000
$ ./bin/getchar_parse_matrix <dat/matrix2.csv
00000010
00010001
01010010
00110001
00000011
00000000
11100111
00011000
仔细检查一下,如果您还有其他问题,请告诉我。
关于c - 从 C 中的矩阵中删除分号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48479411/
;用作语句分隔符,所以放置多个;在语句的末尾很好,因为它只是添加了空语句。 我遇到了这个有多个 ; 的代码最后但删除它们会导致错误: $line =~s;[.,]$;;; 应该与 $line =~s;
当使用自动完成来填充方法参数时,大多数情况下最后应该有一个分号。 似乎必须有一些键盘快捷键可以在最后输入分号(也可能是换行符),但我找不到它! 谢谢。 编辑 : 也许问题不清楚,当完成一个自动完成方法
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我知道我不应该在循环后放置分号。但我正在学习,不小心插入了一个。我想确切地知道我的错误到底发生了什么。所以下次发生类似的事情时,我就知道错误的根源。 在下面的代码中,在这部分代码中: triangul
我想拆分我的查询,但没有得到完全符合我要求的答案。 我的字符串如下: select 1;select \\2; select 3\\;copy customer from 's3://mybucket
VBA 中带有 Debug.Print 语句的分号 ( ; ) 的实际值/含义是什么? 我经常使用它,但对它没有真正的了解,我所知道的是它不等于 vbTab 常量,因为间距不一样。 IE。 Debug
我需要从 HTML 中的 javascript 代码获取分配的变量名称和值。 例如有html代码: ~~ contents var value1 = 55;var value2= 27;
我正在用 JSFiddle 校对这个函数,它说第二行缺少分号,但是我无法确定它会去哪里。 function debtSpiral() { var debtID = setInterval(debt
给定一个使用 ; 策略的有效 Coq 证明,是否有一个通用公式可以将其转换为用 . 替换 ; 的有效等效证明;? 许多 Coq 证明使用 ; 或战术排序策略。作为初学者,我想观察各个步骤的执行,因此我
我被困在工作中,电脑被锁定。但我正在尝试练习我的 Scala。我正在使用 Ideone.com,因为我什至无法安装 scalac... 无论如何这不是编译: class DPt(var name: S
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
考虑这些文件名。 ; f - Copy.txt ;f.txt f - Copy ;- Copy.txt f - Copy.txt 我有这段代码可以解析任何文件中的 & 符号,答案是:Drag and
为什么带有验证器(Mozilla 或 JSlint)的 Aptana 会提示这段代码: var collectionOfValues = { key0 : value0; key1 :
有什么方法可以绑定(bind); (\059) 到 tmux 中的命令? 默认情况下,它绑定(bind)到最后一个 Pane ;但是,我想将其重新绑定(bind)到 select-pane -R。 我
我有一个 Java 字符串,它实际上是一个 SQL 脚本。 CREATE OR REPLACE PROCEDURE Proc AS b NUMBER:=3; c
我有一个 python 字符串: names = "John, Paul; Sally/Frank" 我想用 , 分割字符串;/.我试过: names.split(",") 但我不确定如何通过所有分隔
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我一直在尝试并查看各种命令,但似乎无法找到正确的语法; 我想合并两个 ls 命令的输出,除以 ;(分号)并将输出写入文件。 我的 ls 命令是: ls *.lst ls -d -1 $PWD/*.ls
在声明一组变量而不是分号时使用逗号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我是一名优秀的程序员,十分优秀!