- 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!