- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的输入文件看起来像这样-
# 4
INS 0 3
DEC 0 0
DEL
INS 1 2
DEC 1 0
DEL
INS 2 1
DEC 2 0
INS 3 3
整个模块在输入中多次出现。我想逐行读取输入,然后根据第一个单词(以空格分隔),使用附加值执行必要的功能(如果存在,如 #
、INS
和 DEC
操作)。
我如何允许读取相同的可能的额外值?
到目前为止,我使用 fread
逐行读取它然后拆分它,但 IMO 的工作量太大了。我尝试使用 scanf("%[^\n]\n", variable)
但我又需要对其进行标记化。
此外,当尝试使用 scanf("%[^\n] %[0-9] %[0-9]\n", var1, var2, var3)
指定需要使用 var2 和 var3 作为字符数组。这减少了标记化的需要,但提供了垃圾输入。
有没有更简单的方法来做同样的事情?
Ps- 我在 Ubuntu 17.10 上使用 C。
提前致谢
最佳答案
继续评论,使用 scanf
为新的(和不太新的)C 程序员输入是一个雷区。 scanf
不会读取并包含结尾的 '\n'
,除非您在您的格式字符串 中明确说明它。 转换说明符 根据您读取的是数字、字符还是字符串值,以不同方式处理前导空格。
这是在获取用户输入时推荐面向行的输入函数(例如 fgets
(或 POSIX getline
))的主要原因之一 - - 它们提供了一种简单的方法来验证是否读取了完整的行(例如获取长度并检查最后一个字符是否为 '\n'
)并始终如一地处理输入缓冲区中等待的字符。
此外,使用 fgets
然后解析缓冲区允许分别验证 (1) 读取和 (2) 信息解析。您可以使用 string.h
中符合要求的任何函数解析输入,使用 sscanf
或者简单地通过一个指针(或一对指针)沿着缓冲区向下移动检查每个字符并采取任何必要的行动来利用生产线的每一部分。
一个使用sscanf
进行解析的简单示例可能类似于以下内容。代码期望文件名作为第一个参数读取,如果没有给出参数,它将默认从 stdin
读取:
#include <stdio.h>
#include <string.h>
#define DEL "DEL" /* if you need constants, define them */
enum { MAXARG = 3, MAXC = 512 };
int main (int argc, char **argv) {
int n1, n2; /* integer values from line */
size_t ndx = 0; /* line index */
char buf[MAXC] = "", /* buffer for line */
cmd[MAXARG+1] = ""; /* buffer for 3-char command */
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;
}
while (fgets (buf, MAXC, fp)) { /* read each line in file */
size_t len = 0; /* buf length */
if (*buf == '#') { /* check if first char in line is '#', discard */
fprintf (stderr, "line[%2zu] - discarding comment line.\n", ndx);
ndx++;
continue;
}
len = strlen (buf); /* get length */
if (len && buf[len - 1] != '\n') { /* validate last char '\n' */
fprintf (stderr, "error: line too long, chars remain unread.\n");
break;
}
/* check for 3 values, then 1 value == "DEL", otherwise throw error */
if (sscanf (buf, "%3s %d %d", cmd, &n1, &n2) == MAXARG)
printf ("line[%2zu] (3 vals) : %s %d %d\n", ndx, cmd, n1, n2);
else if (strncmp (DEL, buf, MAXARG) == 0)
printf ("line[%2zu] (1 val) : %s\n", ndx, cmd);
else
fprintf (stderr, "error: invalid line: %zu\n", ndx);
ndx++;
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
示例使用/输出
使用您的数据文件,将按如下方式读取和解析数据。请注意,初始标签表明是否从该行(零索引)中解析了 1 个值或 3 个值:
$ ./bin/misclines <dat/misclines.txt
line[ 0] - discarding comment line.
line[ 1] (3 vals) : INS 0 3
line[ 2] (3 vals) : DEC 0 0
line[ 3] (1 val) : DEL
line[ 4] (3 vals) : INS 1 2
line[ 5] (3 vals) : DEC 1 0
line[ 6] (1 val) : DEL
line[ 7] (3 vals) : INS 2 1
line[ 8] (3 vals) : DEC 2 0
line[ 9] (3 vals) : INS 3 3
检查一下,如果您还有其他问题,请告诉我。
关于c - C中具有可变数量的字符串和整数标记的多行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47277307/
为什么禁用类型像 type t = A of int | B of string * mutable int 虽然允许此类类型: type t = A of int | B of string * i
我正在寻找一种类似结构的数据结构,我可以从中创建多个实例并具有某种类型提示而不是不可变的。 所以我有这样的东西: class ConnectionConfig(NamedTuple): nam
我需要转到引用的结构: class SearchKnot { var isWord : Bool = false var text : String = "" var to
如sec 10.4.3中所述 当控制进入执行时,执行以下步骤 功能对象F(调用者)中包含的功能代码的上下文 提供thisArg,而调用方提供argumentsList: 如
i make a game that start display Activity indicator And activity indicator bottom display UiLable wi
编辑:我在这里不断获得支持。只是为了记录,我认为这不再重要。自从我发布它以来我就不再需要它了。 我想在 Scala 中执行以下操作... def save(srcPath: String, destP
使用可变对象作为 Hashmap 键是一种不好的做法吗?当您尝试使用已修改足以更改其哈希码的键从 HashMap 中检索值时,会发生什么? 例如,给定 class Key { int a; /
如果您在Kotlin中访问List类型的Java值,则将获得(Mutable)List!类型。 例如。: Java代码: public class Example { public stati
我编写了 str 类(内置)的以下扩展,以便执行以下操作:假设我有字符串 "Ciao" ,通过做"Ciao" - "a"我想要的结果是字符串 "Cio" 。这是执行此操作的代码,并且运行良好: cla
使用可变对象作为 Hashmap 键是一种不好的做法吗?当您尝试使用已修改足以更改其哈希码的键从 HashMap 中检索值时,会发生什么? 例如,给定 class Key { int a; /
我正在为我的公司设计一个数据库来管理商业贷款。每笔贷款都可以有担保人,可以是个人或公司,在借款业务失败时作为财务支持。 我有 3 个表:Loan、Person 和 Company,它们存储明显的信息。
我使用二进制序列化从 C# 类中保存 F# 记录。一切正常: F#: type GameState = { LevelStatus : LevelStatus
import javax.swing.JOptionPane; public class HW { public static void main(String[] args) { Strin
使用 flatbuffer mutable 有多少性能损失? 是否“正确”使用 FlatBuffers 来拥有一个应该可编辑的对象/结构(即游戏状态) 在我的示例中,我现在有以下类: class Ga
std::function create_function (args...) { int x = initial_value (args...); return [x] () mut
我需要在 for 循环中找到用户输入的字符。我通常会这样做 如果(句子[i] == 'e') 但是因为在这里,'e' 将是一个单字母字符变量,我不知道如何获取要比较的值。我不能只输入 if (sent
我有一个这样的算法: let seed: Foo = ... let mut stack: Vec = Vec::new(); stack.push(&seed); while let Some(ne
这个问题可能看起来非常基础,但我很难弄清楚如何做。我有一个整数,我需要使用 for 循环来循环整数次。 首先,我尝试了—— fn main() { let number = 10; // An
如果我有以下结构: struct MyStruct { tuple: (i32, i32) }; 以及以下函数: // This will not compile fn function(&mut s
我希望在每个 session 的基础上指定列的默认值。下面的脚本不起作用,但描述了我想如何使用它。我目前使用的是 MySQL 5.5.28,但如果需要可以升级。 CREATE TABLE my_tbl
我是一名优秀的程序员,十分优秀!