c - c fgets 重复最后一个字符
问题描述
我正在尝试从标准输入读取整数值。我有一个内部 while 循环来检测整数系列,以便我可以解析具有多个字符的整数。我用换行符分隔缓冲区,因为输入可以在多行上包含整数。
我处理这个的代码是:
while (fgets(buf, BUF_SIZE, stdin)) {
strtok(buf, "\n");
for(int i = 0; buf[i] != '\0'; i++) {
size_t j = 0;
if(isdigit(buf[i])) {
while(isdigit(buf[i+(int)j])) {
j++;
}
char *new_str = malloc(j*sizeof(char));
size_t k =0;
while(k < j) {
new_str[k] = buf[i+(int)k];
k++;
}
printf("%s\n", new_str);
free(new_str);
}
}
}
输入可能是:1 9 10 10 11
输出应该是:
1
9
10
10
11
我得到的输出是:
1
9
10
0
10
0
11
1
因此,n>1 的输入的每个最后一个字符都会以某种方式被缓冲区读取两次。
我不确定这是怎么可能的,但无法弄清楚。
解决方案
发生这种情况是因为您j
在输入字符串上增长但您忘记与i
一起增长j
。所以你增长j
,在你打印它之后,你会i
从最后一个值增长 1,这i+1
将落在已经打印的输入字符串中......
解决方案是重新初始化 i :
if(isdigit(buf[i])) {
.....
free(new_str);
i = i+j;
}
推荐阅读
- c++ - 将负整数左移零作为未定义行为是否有意义?
- c# - GTK 应用程序不在 Windows 中运行
- python - 您如何使用 if 语句仅排除整数并给出无效的条目消息?
- redux - 用flutter redux更新列表项的问题?
- regex - 此 {{mike}} {{michael}} {{jordan}} 的正则表达式
- wpf - 为什么我不能通过 GridSplitter 调整最后一列的宽度?
- c# - 在 asp.net 核心中替代 HttpConfigurationExtensions.BindParameter
- python - Python_d.exe 和 venv -- 找不到“python_d.exe”
- vb.net - 如何删除逗号的第一个值
- html - 我不知道如何从数据库中的 url 链接获取图像