- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我首先使用fscanf填充第一个数组,然后再次使用同一输入文件中的fscanf填充另一个数组然而,这似乎正在改变我的第一个数组中的值。
以下是我的意见:
4
abcd
efgh
ijkl
mnop
qrst
uvwx
yz12
3456
#include <stdio.h>
void prints( int n, char sqr[n][n]){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
printf("%c", sqr[i][j]);
}
printf("\n");
}
}
int main(void){
FILE *in = fopen("transform.in", "r");
FILE *out = fopen("transform.out", "w");
int num;
fscanf(in, "%d", &num);
char square[num][num];
for (int i = 0; i < num; i++){
fscanf(in, "%s", square[i]);
}
prints(num, square);
printf("\n");
char endSquare[num][num];
for (int i = 0; i < num; i++){
fscanf(in, "%s", endSquare[i]);
}
fclose(in);
prints(num, square);
printf("\n");
prints(num, endSquare);
printf("\n");
fclose(out);
return 0;
}
abcd
efgh
ijkl
mnop
bcd
efgh
ijkl
mnop
qrst
uvwx
yz12
3456
最佳答案
除了不考虑%s
格式说明符将附加的num终止字符外,您还试图使用格式化输入函数fscanf
读取数据行,这使您的工作变得非常困难在进行面向行的输入时,最好使用一个面向行的输入函数,比如fgets
,然后从包含整行信息的缓冲区中解析所需的信息为什么?将数字和字符输入与scanf
函数族混合可以为那些不考虑在输入缓冲区中保留的所有字符或为不同的fscanf
格式说明符如何处理引导空白的帐户提供许多陷阱。
特别是,在您读取num
时,无法使用fscanf
格式说明符限制%s
读取的字符数不能包含可变字段宽度以防止写入超出数组边界(例如,您不能使用%nums
for%4s
之类的东西来确保将读取的字符限制为4
)当使用VLA根据从第一行读取的内容来保存特定数量的字符时,没有一种优雅的方法来合并num
和验证/限制使用fscanf
读取的字符数。
所有这些加起来就构成了一个火车事故,如果你的一条线路的尽头碰巧有一个流浪的space
(或其他字符)的话,那么它就要发生了。
那么,如何处理对4-char
和square
的每一行的只读(注意:大写endsquare
被简化为小写以匹配普通的C样式)当需要处理输入行时,使用面向行的输入函数并提供足够的缓冲区来处理每行数据为了避免未定义的行为,我宁愿使用'S'
缓冲区并确保读取每个128-char
而不是意外地将4-5 char line
行读入5-char
缓冲区此外,您可以使用相同的缓冲区来读取每一行数据。
接下来,必须验证每次读取和每次转换,以确保代码中不会从读取失败或转换失败的点开始处理垃圾例如,在读取数据文件时,可以声明一个简单的缓冲区并按如下方式读取第一行:
#define MAX 128
...
char buf[MAX] = "";
...
if (!fgets (buf, MAX, in)) { /* read 1st line with 'num' */
fprintf (stderr, "error: read of 'num' failed.\n");
return 1;
}
errno = 0; /* errno to check after strtol conversion */
int num = (int)strtol (buf, NULL, 10); /* convert num to int */
if (errno) { /* validate */
fprintf (stderr, "error: failed conversion of 'num'.\n");
return 1;
}
4-char
(read and included by
'\n'
)来确认整行已被读取,如果不存在,则说明行太长(handle error)您还需要知道行中是否有
fgets
字符,因为您没有将行存储为字符串(仅作为字符数组)如果没有
num
读取,则不能将
num-chars
复制到
num-chars
或
square[i]
因为您使用的是
endsquare[i]
循环,所以还必须检查您读取的每一行是否是有效的行仅仅因为您将
for
作为第一行读取,就不能保证文件中有
4
行(理想情况下,您希望使用
8
循环来驱动其余的输入,并在读取
while (fgets (buf, MAX, in))
后使用计数器来中断,但您也可以通过使用
4-lines
验证来保护
for
循环。
if (fgets (buf, MAX, in))
循环:
char square[num][num];
for (int i = 0; i < num; i++) {
size_t len, n = num;
if (!fgets (buf, MAX, in)) /* read line int buf */
break; /* break if no line read */
len = strlen (buf); /* get length */
if (buf[len - 1] != '\n') { /* if no '\n' at end, too long */
fprintf (stderr, "error: line[%d] too long.\n", i);
return 1;
}
if (*buf == '\n') { /* 1st char is '\n' - empty */
fprintf (stderr, "error: empty line encountered.\n");
return 1;
}
if ((int)(len - 1) < num) /* if less than num, reduce num */
n = len - 1;
memcpy (square[i], buf, n); /* copy 'num' chars from buf */
}
4-chars
循环执行同样的操作把所有这些放在一起,您可以执行如下操作(注意:
for
未使用,因此与之相关的代码在下面被注释掉):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define MAX 128
void prints (int n, char (*sqr)[n])
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
putchar (sqr[i][j]);
}
putchar ('\n');
}
}
int main (int argc, char **argv) {
char buf[MAX] = "";
FILE *in = fopen (argc > 1 ? argv[1] : "transform.in", "r");
// FILE *out = fopen ("transform.out", "w");
if (!in /* || !out */) { /* validate both files open */
fprintf (stderr, "error: file open failed.\n");
return 1;
}
if (!(fgets (buf, MAX, in))) { /* read 1st line with 'num' */
fprintf (stderr, "error: read of 'num' failed.\n");
return 1;
}
errno = 0; /* errno to check after strtol conversion */
int num = (int)strtol (buf, NULL, 10); /* convert num to int */
if (errno) { /* validate */
fprintf (stderr, "error: failed conversion of 'num'.\n");
return 1;
}
char square[num][num];
for (int i = 0; i < num; i++) {
size_t len, n = num;
if (!fgets (buf, MAX, in)) /* read line int buf */
break; /* break if no line read */
len = strlen (buf); /* get length */
if (buf[len - 1] != '\n') { /* if no '\n' at end, too long */
fprintf (stderr, "error: line[%d] too long.\n", i);
return 1;
}
if (*buf == '\n') { /* 1st char is '\n' - empty */
fprintf (stderr, "error: empty line encountered.\n");
return 1;
}
if ((int)(len - 1) < num) /* if less than num, reduce num */
n = len - 1;
memcpy (square[i], buf, n); /* copy 'num' chars from buf */
}
prints (num, square);
putchar ('\n');
char endsquare[num][num];
for (int i = 0; i < num; i++) {
size_t len, n = num;
if (!fgets (buf, MAX, in)) /* read line int buf */
break; /* break if no line read */
len = strlen (buf); /* get length */
if (buf[len - 1] != '\n') { /* if no '\n' at end, too long */
fprintf (stderr, "error: line[%d] too long.\n", i);
return 1;
}
if (*buf == '\n') { /* 1st char is '\n' - empty */
fprintf (stderr, "error: empty line encountered.\n");
return 1;
}
if ((int)(len - 1) < num) /* if less than num, reduce num */
n = len - 1;
memcpy (endsquare[i], buf, n); /* copy 'num' chars from buf */
}
fclose(in);
prints (num, square);
putchar ('\n');
prints (num, endsquare);
putchar ('\n');
// fclose(out);
return 0;
}
endsquare
函数来输出单个字符,而是使用设计用于输出单个字符的函数,如
out
(或
printf
)还要注意的是,您应该保留单个行的计数,并将正确的数字传递给
putchar
,以防在任何组(留给您的)中读取的行数少于
fputc
。
$ cat dat/list.txt
4
abcd
efgh
ijkl
mnop
qrst
uvwx
yz12
3456
$ ./bin/inout dat/list.txt
abcd
efgh
ijkl
mnop
abcd
efgh
ijkl
mnop
qrst
uvwx
yz12
3456
void prints (int n, char (*sqr)[n])
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (j)
putchar (' ');
putchar (sqr[i][j]);
}
putchar ('\n');
}
}
prints
$ ./bin/inout dat/list.txt
a b c d
e f g h
i j k l
m n o p
a b c d
e f g h
i j k l
m n o p
q r s t
u v w x
y z 1 2
3 4 5 6
关于c - 使用fscanf填充一个char数组会更改另一个char数组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43964879/
SO亲爱的 friend 们: 2014 年 3 月 18 日。我正在处理一种情况,在使用 ng-repeat 时,数组内的元素(我从 Json 字符串中获取)更改了原始顺序。 需要明确的是,数组中的
有很多问题询问如何在 JavaScript 单击处理程序中更改 div 的类,例如,此处:Change Div style onclick .我理解得很好(只需更改 .className),并且它有效
我从access导入了一个数据库到mysql,但其中一个表的列名“股数”带有空格,但我尝试更改、替换甚至删除列名,但失败了。任何人都可以帮助解决这一问题 String UpdateQuary = "U
我正在做一个随机的学校元素。 目前,我有一个包含两个 CSS 的页面。一种用于正常 View ,一种用于残障人士 View 。 此页面还包括两个按钮,它们将更改使用的样式表。 function c
我需要使用 javascript 更改 HTML 元素中的文本,但我不知道该怎么做。 ¿有什么帮助吗? 我把它定义成这样: Text I want to change. 我正在尝试这样做: docum
我在它自己的文件 nav_bar.shtml 中有一个主导航栏,每个其他页面都包含该导航栏。这个菜单栏是一个 jQuery 菜单栏(ApyCom 是销售这些导航栏的公司的名称)。导航栏上的元素如何确定
我正在摆弄我的代码,并开始想知道这个变化是否来自: if(array[index] == 0) 对此: if(!array[index] != 0) 可能会影响任何代码,或者它只是做同样的事情而我不需
我一直在想办法调整控制台窗口的大小。这是我正在使用的函数的代码: #include #include #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd;
我有很多情况会导致相同的消息框警报。 有没有比做几个 if 语句更简单/更好的解决方案? PRODUCTS BOX1 BOX2 BOX3
我有一个包含这些元素的 XELEMENT B Bob Petier 19310227 1 我想像这样转换前缀。 B Bob Pet
我使用 MySQL 5.6 遇到了这种情况: 此查询有效并返回预期结果: select * from some_table where a = 'b' and metadata->>"$.countr
我想知道是否有人知道可以检测 R 中日期列格式的任何中断的包或函数,即检测日期向量格式更改的位置,例如: 11/2/90 12/2/90 . . . 15/Feb/1990 16/Feb/1990 .
我希望能够在小部件显示后更改 GtkButton 的标签 char *ButtonStance == "Connect"; GtkWidget *EntryButton = gtk_button_ne
我正在使用 Altera DE2 FPGA 开发板并尝试使用 SD 卡端口和音频线路输出。我正在使用 VHDL 和 C 进行编程,但由于缺乏经验/知识,我在 C 部分遇到了困难。 目前,我可以从 SD
注意到这个链接后: http://www.newscientist.com/blogs/nstv/2010/12/best-videos-of-2010-progress-bar-illusion.h
我想知道在某些情况下,即使剧本任务已成功执行并且 ok=2,ansible 也会显示“changed=0”。使用 Rest API 和 uri 模块时会发生这种情况。我试图找到解释但没有成功。谁能告诉
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: add buttons to push notification alert 是否可以在远程通知显示的警报框中指定有
当您的 TabBarController 中有超过 5 个 View Controller 时,系统会自动为您设置一个“更多” View 。是否可以更改此 View 中导航栏的颜色以匹配我正在使用的颜
如何更改.AndroidStudioBeta文件夹的位置,默认情况下,该文件夹位于Windows中的\ .. \ User \ .AndroidStudioBeta,而不会破坏任何内容? /编辑: 找
我目前正在尝试将更具功能性的编程风格应用于涉及低级(基于 LWJGL)GUI 开发的项目。显然,在这种情况下,需要携带很多状态,这在当前版本中是可变的。我的目标是最终拥有一个完全不可变的状态,以避免状
我是一名优秀的程序员,十分优秀!