gpt4 book ai didi

c - 这个例子是如何工作的? (书中的gets函数示例)

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

特别是在 while 循环中

  1. 什么变量在为 getchar() 函数提供数据?if 是 's' 表示的地方?

  2. 这个功能好用吗?我发现各种“读取”函数(如 gets()、fgets() 或 scanf())存在问题。这个会像其他问题一样产生问题吗?

    char * mygets(char *s) {
    int i = 0, ch;
    while ((ch = getchar()) != '\n')
    s[i++] = ch;
    s[i] = '\0';
    return s;
    }

    main() {
    char input[21];
    printf("type anything:\n");
    mygets(input);
    printf("output: %s\n", input);
    }

最佳答案

当您使用 getchar(3) 或 gets(3) 函数时,输入是从进程标准输入中读取的。

The getchar() function is equivalent to getc(stdin).

由于 gets 一次读取一个字符,您需要计算读取的字符数,并确保您不会“走出可用空间的尽头”。这意味着您需要传递 s 的“大小”。

char*
mygets(char *s) {
//is s a valid pointer to memory?
//how much space is available in s?
int i = 0, ch;
//what is the maximum value of an int?
//what happens when i++ exceeds MAX_INT?
//does -1 make sense?
//getchar(3) can return EOF
while ((ch = getchar()) != '\n')
s[i++] = ch;
s[i] = '\0';
return s;
}

试试这样的方法。计算读取的字符数,检查您是否没有超出所传递缓冲区的末尾,并且

char*
mygets(char* s, const size_t size) {
if( !s ) return s; //error, null pointer passed
size_t count=0;
char* sp = s;
int ch;
for( ; (count<size) && ((ch = getchar()) != EOF); ) {
++count; //count each character read, but not EOF
if( (*sp++ = ch) == '\n' ) break; //store characters read, check for newline
}
*sp = '\0'; //null terminate s
return s;
}

您应该只传递合理的大小值和合理的 s 值(至少 大小的有效字符缓冲区)。用法示例:

char buffer[999];
mygets(buffer, 999); //or mygets(buffer, sizeof(buffer));

关于c - 这个例子是如何工作的? (书中的gets函数示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50519008/

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