更改 scanf() 分隔符

2024-02-13

我的目标是改变分隔符scanf to "\n”。 我尝试使用scanf("%[^\n]s",sen);并且对于单一输入工作得很好。 但是当我将同一条线放入for循环多个句子它给了我垃圾值。

有谁知道为什么?


这是我的代码:

char sen[20];
for (i=0;i<2;i++)
{
    scanf("%[^\n]s",sen);
    printf("%s\n",sen);
}

考虑这个(C99)代码:

#include <stdio.h>

int main(void)
{
    char buffer[256];

    while (scanf("%255[^\n]", buffer) == 1)
        printf("Found <<%s>>\n", buffer);
    int c;
    if ((c = getchar()) != EOF)
        printf("Failed on character %d (%c)\n", c, c);
    return(0);
}

When I run it and type in a string 'absolutely anything with   spaces TABTABtabs galore!', it gives me:

Found <<absolutely anything with   spaces       tabs galore!>>
Failed on character 10 (
)

ASCII (UTF-8) 1010 is newline, of course.

这有助于您理解您的问题吗?


它在这种情况下有效(对于单行),但如果我想将多行输入放入数组数组中,那么它会失败。我不明白怎么办scanf在您的代码中返回一个值?

许多(大多数?)经验丰富的 C 程序员避免使用 C 语言是有原因的scanf() and fscanf()像瘟疫一样;他们很难正常工作。我推荐这个替代方案,使用sscanf(),这并没有得到同样的咒骂scanf() and fscanf() do.

#include <stdio.h>

int main(void)
{
    char line[256];
    char sen[256];

    while (fgets(line, sizeof(line), stdin) != 0)
    {
        if (sscanf(line, "%255[^\n]", sen) != 1)
            break;
        printf("Found <<%s>>\n", sen);
    }
    int c;
    if ((c = getchar()) != EOF)
        printf("Failed on character %d (%c)\n", c, c);
    return(0);
}

这会读取输入行(使用fgets()这确保没有缓冲区溢出(假装gets()功能,如果您听说过它,会将您的计算机熔化成金属和硅池),然后使用sscanf()处理该行。这涉及换行符,这是原始代码的失败。

char sen[20];
for (i=0;i<2;i++)
{
    scanf("%[^\n]s",sen);
    printf("%s\n",sen);
}

问题:

  1. 你不检查是否scanf()成功了。
  2. 在第一次迭代时将换行符留在缓冲区中;第二次迭代生成返回值 0,因为要读取的第一个字符是换行符,该字符是扫描集排除的字符。
  3. 您看到的乱码可能是重复的第一行输入。事实上,如果不是有界循环,它不会等你再输入任何内容;它会一遍又一遍地吐出第一行。

返回值来自scanf()

的定义scanf()(来自 ISO/IEC 9899:1999)是:

§7.19.6.4 scanf 函数

Synopsis

 #include <stdio.h>
 int scanf(const char * restrict format, ...);

描述

2 The scanf函数相当于fscanf与论证stdin介入 在参数之前scanf.

Returns

3 The scanf如果之前发生输入失败,函数返回宏 EOF 的值 任何转换。否则,scanf函数返回输入项的数量 分配的数量可能少于规定的数量,如果提前分配,甚至为零 匹配失败。

请注意,当我的第一个程序中的循环退出时,这是因为scanf()返回 0,而不是 EOF。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 scanf() 分隔符 的相关文章

随机推荐

  • 自定义语言的 Gradle 插件

    我有一种自定义语言 假设它是 MyLang 但它可以是任何语言 我想为其制作一个插件 该插件需要 能够识别 DSL 给定语言的源集 能够使用可执行文件 编译器 来编译它们 我能够创建一个带有编译任务 还为空 的插件 并使用 Language
  • 将 XWPFRun 拆分为多个运行

    我正在尝试修改existingWord 文档自动将其中的某些关键字加粗 举个例子 敏捷的棕色狐狸跳过了懒狗 1 会成为 快速棕色fox跳过懒惰者dog 2 我的问题是 1 是一次运行 2 变成 5 次运行 5 作为狗后面的句点不是粗体 但它
  • netty中非阻塞通道中的SO_TIMEOUT

    如果通道在超时毫秒内未收到读取 响应 SO TIMEOUT 是否会使非阻塞通道过期 bootstrap group workerGroup channel NioSocketChannel class handler channelInit
  • JBoss 5.0.1 上的 servlet jar 文件在哪里?

    大家好 我正在尝试设置要在 JBossAS 5 0 1 上运行的构建文件 并且我需要找到应该用于构建的 servlet jar 文件 我看过的所有网页似乎都表明该文件是 javax servlet jar 并且它应该位于 C server
  • 尝试播放音频 (.wav) 文件时没有声音

    我有一个非常简单的类 可以使用以下代码播放声音文件 import java io File import java io IOException import javax sound sampled AudioSystem import j
  • Vuetify 数据表不显示数据

    Vuetify 数据表不显示数据 显示显示了 1 行中的 1 行 但表体为空 我的组件代码
  • 从子表单更改父表单属性的正确方法是什么?

    我只是想知道我是否以正确的方式这样做 我有两个表单 一个父表单和一个子表单 选项对话框 要从子表单更改父表单中的属性 我使用如下代码 Create an array of all rich textboxes on the parent f
  • 部署时捆绑器错误

    我目前正在使用guard 即guard coffeescript gem 在我的OSX 开发系统上编译我的javascript 将来我可能会添加更多的guard 任务 我添加了rb fseventgem 到我的 Gemspec 现在我看到在
  • 我应该在临时/生产环境中使用 PHPUnit 吗?

    我已经安装了 PHPUnit 框架来执行单元测试 我已经编写了测试用例 并且还使用了现有的 PHPUnit 库进行测试 是否需要在临时和生产环境中配置 PHPUnit 框架 如果是这样 phpunit 测试框架和相关文件会在暂存和生产中占用
  • Angular2 ng-bootstrap:使用不同的数据重用模态模板

    我正在构建一个类似仪表板的界面 其中包含一组包含可比数据的实体 这些实体中的每一个都有一个编辑按钮 我想用它来打开一个显示相应数据的模式 我想重用相同的模式模板 并显示来自单击编辑按钮的实体的数据 我在用Angular2 with ng 引
  • 检查 Java 中的内存布局

    我正在尝试继承 出于教育目的 我想检查为各种对象分配的地址以及对象内的字段 有没有一个工具可以让我查看 JVM 正在使用哪些内存以及它的用途 例如 如果我有两个课程 class A int i j int f class B extends
  • 在 cap 部署时预编译资产时收到“警告:已初始化常量”

    目前 我在通过 capistrano 进行生产部署时遇到了关于部署 资产 预编译的奇怪警告消息 当我第一次部署演示 Rails 项目时运行 cap 生产部署时 收到以下警告消息 并且部署失败 cap 中止
  • 如何通过创建React应用程序启用JIT(即时模式)?

    我尝试自己在 create react app 中设置 JIT 但它似乎不起作用 因为样式没有更新 我正在使用 craco 来构建带有 tailwind css 的应用程序 并且还添加了 TAILWIND mode WATCH 因为他们建议
  • 如何自动装配 Spring 环境对象

    我正在尝试从应用程序对象内的 properties 文件获取属性 我对如何做到这一点的唯一了解是通过Environment object 它在我的配置中运行得很好 Configuration ComponentScan basePackag
  • 使用基于 Spark 数据集的 ML API 时初始化逻辑回归系数?

    默认情况下 逻辑回归训练将系数初始化为全零 但是 我想自己初始化系数 这将很有用 例如 如果之前的训练运行在几次迭代后崩溃了 我可以简单地使用最后一组已知的系数重新开始训练 这对于任何基于数据集 数据帧的 API 最好是 Scala 是否可
  • div 真的可以覆盖布局上所有内容的 table 吗?

    也许已经有一个关于这个主题的问题 但我找不到它 我的问题很简单 我可以在页面布局上仅使用 div 吗 例如 我在创建一个带有角的 div 时遇到了麻烦 A B C D E F G H I 将所有字母作为带有一些背景的div 而字母E是放置内
  • Kubernetes:获取容器内的实际资源限制

    有没有办法获取容器内的实际资源 CPU 和内存 约束 假设节点有 4 个核心 但我的容器通过资源请求 限制仅配置了 1 个核心 因此它实际上使用 1 个核心 但它仍然从 proc cpuinfo 看到 4 个核心 我想根据应用程序实际可以使
  • 查询线程(不是进程)处理器关联性?

    在 Windows 上 您可以为进程调用 SetProcessAffinityMask 为线程调用 SetThreadAffinityMask 然而 Windows 似乎只公开 GetProcessAffinityMask 而不是针对进程的
  • 部署到 OS X 10.6 和“使用旧版运行时的平台不支持 -fobj-arc”

    背景 我正在为 OS X 构建一个应用程序 部署目标为 10 6 我还没有将我的应用程序完全转换为 ARC 但我添加了一些将从 ARC 中受益的新类 因此我设置了 fobj arc这些类的编译器标志 编译失败通用 32 64 位英特尔架构
  • 更改 scanf() 分隔符

    我的目标是改变分隔符scanf to n 我尝试使用scanf n s sen 并且对于单一输入工作得很好 但是当我将同一条线放入for循环多个句子它给了我垃圾值 有谁知道为什么 这是我的代码 char sen 20 for i 0 i l