gpt4 book ai didi

c - 使用 scanf 从控制台读取无限行

转载 作者:太空宇宙 更新时间:2023-11-04 07:09:17 24 4
gpt4 key购买 nike

我需要读取一个有限但长度没有限制的字符串。我们只了解了 scanf,所以我想我不能使用 fgets。不管怎样,我已经在长度大于 5 的输入上运行了这段代码。

char arr[5];
scanf("%s", arr);

char *s = arr;
while (*s != '\0')
printf("%c", *s++);

scanf 不断地扫描和写入溢出的部分,但它看起来像一个 hack。这是一个好习惯吗?如果不是,我该如何阅读?

注意:我们已经了解了 alloc 函数系列。

最佳答案

缓冲区溢出是一种瘟疫,是最著名但最难以捉摸的错误之一。所以你绝对不应该依赖它们。

既然您已经了解了 malloc() 和 friend ,我想您应该会使用它们。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

// Array growing step size
#define CHUNK_SIZE 8

int main(void) {
size_t arrSize = CHUNK_SIZE;
char *arr = malloc(arrSize);
if(!arr) {
fprintf(stderr, "Initial allocation failed.\n");
goto failure;
}

// One past the end of the array
// (next insertion position)
size_t arrEnd = 0u;

for(char c = '\0'; c != '\n';) {
if(scanf("%c", &c) != 1) {
fprintf(stderr, "Reading character %zu failed.\n", arrEnd);
goto failure;
}

// No more room, grow the array
// (-1) takes into account the
// nul terminator.
if(arrEnd == arrSize - 1) {
arrSize += CHUNK_SIZE;
char *newArr = realloc(arr, arrSize);
if(!newArr) {
fprintf(stderr, "Reallocation failed.\n");
goto failure;
}
arr = newArr;

// Debug output
arr[arrEnd] = '\0';
printf("> %s\n", arr);
// Debug output
}

// Append the character and
// advance the end index
arr[arrEnd++] = c;
}
// Nul-terminate the array
arr[arrEnd++] = '\0';

// Done !
printf("%s", arr);

free(arr);
return 0;

failure:
free(arr);
return 1;
}

关于c - 使用 scanf 从控制台读取无限行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29685896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com