首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果fgets大于指定的大小,如何添加错误消息以重试,而程序不会自动关闭

在处理fgets函数返回的输入时,如果输入的大小超过了指定的大小,可以通过以下步骤来添加错误消息以重试,同时确保程序不会自动关闭:

  1. 首先,需要定义一个足够大的缓冲区来存储输入的数据。可以使用字符数组或者动态分配的内存来实现。
  2. 在调用fgets函数之前,需要检查输入的大小是否超过了指定的大小。可以使用strlen函数来获取输入的长度,并与指定的大小进行比较。
  3. 如果输入的大小超过了指定的大小,可以使用错误消息来提示用户重新输入。可以使用printf函数输出错误消息,例如:"输入超过了指定的大小,请重新输入"。
  4. 在输出错误消息后,可以使用循环来继续获取输入,直到输入的大小符合要求为止。可以使用while循环来实现。
  5. 在循环中,需要再次调用fgets函数来获取输入。可以使用相同的缓冲区来存储输入的数据。
  6. 在获取输入后,需要再次检查输入的大小是否符合要求。如果符合要求,则可以继续处理输入的数据。如果不符合要求,则需要继续输出错误消息并重新获取输入。

以下是一个示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <string.h>

#define MAX_SIZE 100

int main() {
    char input[MAX_SIZE];
    char* result;

    do {
        printf("请输入字符串:");
        result = fgets(input, sizeof(input), stdin);
        if (result == NULL) {
            printf("读取输入失败\n");
            return 1;
        }

        // 检查输入的大小是否超过了指定的大小
        if (strlen(input) > MAX_SIZE) {
            printf("输入超过了指定的大小,请重新输入\n");
        }
    } while (strlen(input) > MAX_SIZE);

    // 处理输入的数据
    printf("输入的字符串是:%s\n", input);

    return 0;
}

在上述示例代码中,如果输入的字符串超过了指定的大小(MAX_SIZE),程序会输出错误消息并要求用户重新输入,直到输入的大小符合要求为止。然后,程序会继续处理输入的数据。

请注意,上述示例代码仅演示了如何处理fgets函数返回的输入大小超过指定大小的情况,并没有涉及到云计算或其他相关领域的知识。如果需要了解更多关于云计算或其他领域的知识,请提供相关的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Apache Kafka - 重识Kafka生产者

retries 该配置项指定了生产者在发送消息失败后的重试次数。默认值为 0,表示不进行重试。...如果设置为大于 0 的值,则当发送消息失败时,生产者会自动进行重试,直到达到最大重试次数或发送成功为止。 batch.size 该配置项指定了生产者在发送消息时的批量大小。...如果设置为大于 0 的值,则表示等待指定的时间后再发送,以便将更多的消息打包在一起。 buffer.memory 该配置项指定了生产者用于缓存尚未发送的消息的缓冲区大小。...如果消息体较大,可以考虑使用压缩算法,以减少网络负载和存储空间。...如果设置得太小,则可能会导致吞吐量下降;如果设置得太大,则可能会导致网络负载过大。 max.request.size 该配置项指定了生产者发送消息时允许的最大消息大小。

31330

CC++ (stdio.h)标准库详解

buffer:指向用户提供缓冲区的指针。如果这个参数是 NULL,则库函数会为流自动分配一个缓冲区。 mode:指定缓冲区的模式。有效的模式有: _IONBF:关闭缓冲。...当流关闭 (fclose) 或程序正常终止时,创建的临时文件会自动删除。如果程序异常终止,是否删除文件取决于具体的系统和库实现。...请注意,fputs 与 put 的不同之处不仅在于可以指定目标流,而且 fputs 不会写入其他字符,而 puts 会自动在末尾附加换行符。...然后使用 ferror 函数来检查文件流的错误标志,以确定文件操作是否发生了错误。如果发生了错误,则输出相应的错误信息。最后关闭文件并返回 0。...如果是 null 指针,则不会打印前面的自定义消息,但仍会打印错误消息。 按照惯例,应用程序本身的名称通常用作参数。

92710
  • gets 、getchar 、fgets 、scanf的用法

    ,并在最后自动添加一个’\0’。...3.fgets   从文件或标准输入接收一串字符,遇到’\n’时结束,把’\n’也作为一个字符接收;把接收的一串字符存储在形式参数指针指向的空间,并在’\n’后再自动添加一个’\0’。...函数 gets 可以无限读取,不会判断上限,所以程序员应该确保 buffer 的空间足够大,以便在执行读操作时不发生溢出。...相对于 gets 函数,fgets 函数最大的改进就是能够读取指定大小的数据,从而避免 gets 函数从 stdin 接收字符串而不检查它所复制的缓冲区空间大小导致的缓存溢出问题。...("输出: %s\n",buffer); return 0; }   对于上面的示例代码,如果输入的字符串小于或等于 10 个字符,那么程序将完整地输出结果;如果输入的字符串大于 10 个字符,那么程序将截断输入的字符串

    3.3K60

    C语言文件操作

    如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。...因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂ 件。 如果不做,可能导致读写⽂件的问题。...fgets和fputs fgets从流中获取字符串并将其作为C字符串存储到str中,直到读取(num-1)个字符,或者到达换行符或文件结束符,以先发生的为准。...fputs将字符串写入流函数从指定的地址(str)开始复制,直到到达结束的空字符('\0')。这个终止的空字符不会复制到流中。...(注意,fputs与puts的不同之处不仅在于可以指定目标流,而且fputs不会写入额外的字符,而puts会自动在末尾附加一个换行符。)

    5810

    Kafka系列2:深入理解Kafka生产者

    如果没有指定分区 ,那么分区器会根据 ProducerRecord 对象的键来选择一个分区,紧接着,这条记录被添加到一个记录批次里,这个批次里的所有消息会被发送到相同的主题和分区上。...生产者在收到错误之后会尝试重新发送消息,如果达到指定的重试次数后还没有成功,则直接抛出异常,不再重试。...如果程序发送消息的速度超过了发送到服务器的速度,会导致生产者缓冲区空间不足,这时候调用send()方法要么被阻塞,要么抛出异常。 compression.type 默认情况下,发送的消息不会被压缩。...retries 指定了生产者放消息发生错误后,消息重发的次数。如果达到设定值,生产者就会放弃重试并返回错误。...那么如果第一个批次消息写入失败,而第二个成功,Broker会重试写入第一个批次,如果此时第一个批次写入成功,那么两个批次的顺序就反过来了。也即,要保证消息是有序的,消息是否写入成功也是很关键的。

    97020

    03 Confluent_Kafka权威指南 第三章: Kafka 生产者:向kafka写消息

    当分区选出新的leader的时候,可以解决无leader错误。KafkaProducer可以配置为对这些错误进行自动重试,因此只有当重试次数达到最大还没有解决这些错误时,程序代码才会返回不可重试异常。...有些错误异常无法通过重试来解决,例如,消息的大小太大,这种情况下,kafkkaProducer不会尝试重试,将立即返回错误。...如果超时而没有应答,生产者将返回重试或者响应一个错误超时(通过异常或者发送回调)。timeout.ms控制broker等待同步副本确认消息以满足acks配置的时间。...通常再可靠性要求较高的系统中,将重试次数设置为0时不可选的,因此,要保证顺序性的关键就是设置in.flight.requests.per.session=1,以确保一批消息重试的时候,将不会发送其他的消息...这个例子说明了使用avro的好处,即使我们在没由更改读取数据的全部应用程序的情况下而更改了消息中的模式,也不会出现异常和中断错误,也不需要对全部数据进行更新。

    2.8K30

    RocketMQ

    默认情况下生产者会把消息以Round Robin轮询方式发送到不同的Queue分区队列;而消费消息时会从多个Queue上拉取消息,这种情况下的发送和消费是不能保证顺序的。...3、使用mqadmin命令手动创建Topic时指定Queue数量。 分区有序 如果有多个Queue参与,其仅可保证在该Queue分区队列上的消息顺序,则称为分区有序。 如何实现Queue的选择?...的情况 // 若存在某条消息,其本身大小大于4M,这个分割器无法处理,其直接将这条消息构成一个子列表返回。...加载的配置文件中添加如下属性,以开启该功能: enablePropertyFilter = true 在启动Broker时需要指定这个修改过的配置文件。...死信队列 什么是死信队列 当一条消息初次消费失败,消息队列会自动进行消费重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中

    2.6K84

    【Linux】进程间通信——命名管道

    0,失败返回-1 ---- 管道文件的使用 将hello world 重定向到fifo管道中 但是好像并不会写入 fifo只代表一种符号,向符号写入消息并不会刷新到磁盘上,而是只会把hello world...写到管道中 但是管道文件是内存文件,所以大小不会改变 ---- 通过赋值SSH渠道,创建终端2 在保证终端1的输出重定向 运行的情况下 cat默认从显示器中读取 在终端2中 使用输入重定向 将 fifo...==0,说明读到文件结尾,当写端关闭时,读端才会读到文件结尾 若返回错误码 3....---- 为了避免输入的单词有空格存在 输入 man fgets 指令 从指定的流中获取字符串,并规定字符串的大小 ---- 因为有两个可执行程序存在,所以需要两个终端 当终端2没有运行server...时,没有管道文件存在,而终端1运行server后,终端1中出现管道文件 ---- 当终端1运行client时,输入对应的信息,终端2中会自动显示出来 client端可以将信息发送给server端 完整代码

    1.9K30

    【C语言基础】:文件操作详解(后篇)

    注意,fputs与puts的不同之处不仅在于可以指定目标流,而且fputs不会写入额外的字符,而puts会自动在末尾附加一个换行符。...size:每个数据项的大小(以字节为单位)。 count:要读取的数据项的数量。 stream:指向文件的指针,它指定了从中读取数据的文件。...对于以二进制模式打开的流,通过将偏移量添加到由origin指定的参考位置来定义新位置。...标准采用“缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟⼀块“文件缓冲区”。...如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

    15410

    Kafka 生产者哪些重要的参数是我们需要注意的?

    不过了解这些参数可以让我们更合理地使用生产者客户端,其中还有一些重要的参数涉及程序的可用性和性能,如果能够熟练掌握它们,也可以让我们在编写相关的程序时能够更好地进行性能调优与故障排查。...消息在从生产者发出到成功写入服务器之前可能发生一些临时性的异常,比如网络抖动、leader 副本的选举等,这种异常往往是可以自行恢复的,生产者可以通过配置 retries 大于0的值,以此通过内部重试来恢复而不是一味地将异常抛给生产者的应用程序...如果将 retries 参数配置为非零值,并且 max.in.flight.requests.per.connection 参数配置为大于1的值,那么就会出现错序的现象:如果第一批次消息写入失败,而第二批次消息写入成功...4. compression.type 这个参数用来指定消息的压缩方式,默认值为“none”,即默认情况下,消息不会被压缩。该参数还可以配置为“gzip”“snappy”和“lz4”。...5. connections.max.idle.ms 这个参数用来指定在多久之后关闭闲置的连接,默认值是540000(ms),即9分钟。

    48671

    Kafka生产者哪些重要的参数是我们需要注意的?

    不过了解这些参数可以让我们更合理地使用生产者客户端,其中还有一些重要的参数涉及程序的可用性和性能,如果能够熟练掌握它们,也可以让我们在编写相关的程序时能够更好地进行性能调优与故障排查。...消息在从生产者发出到成功写入服务器之前可能发生一些临时性的异常,比如网络抖动、leader 副本的选举等,这种异常往往是可以自行恢复的,生产者可以通过配置 retries 大于0的值,以此通过内部重试来恢复而不是一味地将异常抛给生产者的应用程序...如果将 retries 参数配置为非零值,并且 max.in.flight.requests.per.connection 参数配置为大于1的值,那么就会出现错序的现象:如果第一批次消息写入失败,而第二批次消息写入成功...4. compression.type 这个参数用来指定消息的压缩方式,默认值为“none”,即默认情况下,消息不会被压缩。该参数还可以配置为“gzip”“snappy”和“lz4”。...5. connections.max.idle.ms 这个参数用来指定在多久之后关闭闲置的连接,默认值是540000(ms),即9分钟。

    1.6K50

    C 标准库基础 IO 操作总结

    打开文件应该与关闭文件成对存在,虽然程序在退出时会释放相应的资源,但是对于一个长时间运行服务程序来说,经常打开而不关闭文件是会造成进程资源耗尽的,因为进程的文件描述符个数是有限的,及时关闭文件是个好习惯...,用户不可以指定缓冲区大小,很容易造成缓冲区溢出错误。...不过 strcpy 程序员还是可以避免,而 gets 的输入用户可以提供任意长的字符串,唯一避免方法就是不使用 gets,而使用 fgets(buf, size, stdin) fgets 函数从 stream...所指文件读取以 ‘\n’ 结尾的一行,包括 ‘\n’ 在内,存到缓冲区中,并在该行结尾添加一个 ‘\0’ 组成完整的字符串。...flush 操作,如果: 用户程序调用库函数从无缓冲的文件中读取 或从行缓冲的文件中读取,且这次读操作会引发系统调用从内核读取数据,那么会读之前自动 flush 所有行缓冲 程序退出时通常也会自动 flush

    98330

    文件的顺序读写——顺序读写函数——fgets、fgetc、fputs、 fputc

    如果调用时流位于文件末尾,则该函数将返回 EOF 并设置流的文件末尾指示器 (feof) 。 返回值: 如果发生读取错误,该函数将返回 EOF 并设置流的错误指示器 (ferror)。...如果发生其他读取错误,该函数也会返回 EOF,但会设置其错误指示器 (ferror)。 举例: 创建一个文件,并向其中写入小写字母a到z,然后关闭文件。...该函数从指定的地址 (str) 开始复制,直到到达终止 null 字符 ('\0')。此终止 null 字符不会复制到流中。...fputs 与 puts的不同之处在于可以指定目标流,而且 fputs 不会写入其他字符,而 puts 会自动在末尾附加一个换行符。...fgets 与 gets 有很大不同:fgets 不仅接受流参数,还允许指定 str 的最大大小,并在字符串中包含任何结束换行符。

    32810

    C 语言文件操作详解

    数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。...可以通过 offset 和 whence 参数指定新的位置。 ftell:用于获取当前文件指针的位置,以字节为单位。它可以帮助你确定文件指针在文件中的具体位置。...1.相关函数 1.perror 功能:perror 用于输出错误信息。它将描述 errno 变量中存储的错误代码对应的错误信息,并附加一个自定义的错误消息前缀。...用法: void perror(const char *str); 参数:str:自定义的错误消息前缀,通常是描述错误来源的字符串。它会与 errno 中的错误信息一起输出。...之后使用 feof 检查是否因为到达文件末尾而结束循环。 3. ferror 功能:ferror 用于检查文件流是否发生了读取或写入错误。

    19810

    CCPP输入输出函数汇总分析

    ,该行的字符数 不大于num-1.因为fgets函数会在末尾加上一个空字符以构成一个字符串.另外fgets在读取到换行符后不会将其省略. fputs() int fputs(char *str, file...它从指定的文件中读取下一个字符并返回该字符,如果到达文件末尾或发生错误,则返回 EOF。...补充:必须指定用户进程缓冲区的长度n,即buf的大小,此函数从流中一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符被送入用户缓冲区buf中。该缓冲区以null字符结尾。...而fgets和fputs在处理换行符,本着实事求是的态度,有就有,没有就没有,不会在用户buf和流缓冲以及文件中自己添加,只是在数据经过流缓冲时,增加或是过滤到null字符。...当fgets时会在用户buf中增加一个null以标识用户buf的结束,而fputs时,以null为终止字符,但是尾端的null并不写在流中。

    1.8K20

    04 Confluent_Kafka权威指南 第四章: kafka消费者:从kafka读取数据

    如果我们将另外一个消费者C2添加到组G1,每个消费者将分别从其中的两个分区获得消息,可能分区0和2的消息会被C1消费,而1和3的消息将会被C2消费。 ?...在第二章中介绍了如何选择一个topic的分区数量。 除了通过添加消费者以扩展单个应用程序之外,多个应用程序从同一个主题读取数据的情况也很常见。...要确保应用程序获得topic中的所有消息,需要确保应用程序使用自己的消费者组。与许多传统的消息队列系统不同,kafka可以扩展到大量的消费者和消费者组而不会降低性能。...你可以将消费者添加到现有的消费者组,以扩展对topic消息的读取和处理,消费者组中额外的各个消费者只能获得消息的子集。...只要没有无法恢复的错误,commitSync就会尝试重试提交。如果发生了无法恢复的错误,我们除了记录错误之外没有更好的办法。

    3.6K32

    斗转星移 | 三万字总结Kafka各个版本差异

    KIP还为这样的阻塞API添加了重载,以支持指定每个阻塞API使用的特定超时,而不是使用默认超时设置default.api.timeout.ms。...如果客户端连接验证失败,则不会执行重试。 自定义SaslServer实现可能会抛出SaslAuthenticationException提供错误消息以返回到客户端,指示身份验证失败的原因。...还要注意,虽然先前代理将确保在每个获取请求中返回至少一条消息(无论总数和分区级提取大小如何),但现在相同的行为适用于一个消息批处理。...而是返回UNKNOWN_TOPIC_OR_PARTITION错误代码。这可能会在使用生产者和消费者时导致意外超时或延迟,因为Kafka客户端通常会在未知主题错误时自动重试。...如果找到大于响应/分区大小限制的消息,则消费者和副本可以取得进展。更具体地说,如果获取的第一个非空分区中的第一条消息大于其中一个或两个限制,则仍将返回该消息。

    2.4K32

    Kafka 事务之偏移量的提交对数据的影响

    如果提交的偏移量大于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息将会丢失。 因此,如果处理偏移量,会对客户端处理数据产生影响。...如果发生了再均衡,从最近一批消息到发生再均衡之间的所有消息都将被重复处理。 同时在这个程序中,只要没有发生不可恢复的错误,commitSync() 方法会一直尝试直至提交成功。...在成功提交或碰到无法恢复的错误之前,commitSync() 会一直重试,但是 commitAsync() 不会,这也是 commitAsync() 不好的一个地方。...回调经常被用于记录提交错误或生成度量指标。如果要用它来进行重试,则一定要注意提交的顺序。 ?...如果直接关闭消费者,就没有所谓的“下一次提交”了,因为不会再调用poll()方法。使用 commitSync() 方法会一直重试,直到提交成功或发生无法恢复的错误。

    1.5K10

    真的,关于 Kafka 入门看这一篇就够了

    传递消息:Kafka 另外一个基本用途是传递消息,应用程序向用户发送通知就是通过传递消息来实现的,这些应用组件可以生成消息,而不需要关心消息的格式,也不需要关心消息是如何发送的。...,不仅消息不会被接收,还会收到 broker 返回的错误消息。...跟其他与字节相关的配置参数一样,该参数指的是压缩后的消息大小,也就是说,只要压缩后的消息小于 mesage.max.bytes,那么消息的实际大小可以大于这个值 这个值对性能有显著的影响。...比如连接的错误,可以通过再次建立连接来解决;无主错误则可以通过重新为分区选举首领来解决。KafkaProducer 被配置为自动重试,如果多次重试后仍无法解决问题,则会抛出重试异常。...另一类错误是无法通过重试来解决的,比如消息过大对于这类错误,KafkaProducer 不会进行重试,直接抛出异常。

    1.3K22
    领券