这个例子有用吗? (书籍获取功能的例子)

时间:2018-05-24 22:23:49

标签: c string function

特别是在while循环

  1. getchar()函数的变量是什么?如果是' 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);
    }
    

2 个答案:

答案 0 :(得分:0)

1)getchar()获取一个字符,因为它被键入....所以它'等待'你键入...键盘上的一个字符..

2)这是一个基本功能,有更多优化和高级功能可以用角色来做这些事情......但是如果你想要正确编码,理解这里发生的事情是非常重要的。

干杯...

答案 1 :(得分:0)

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

  

getchar()函数等同于getc(stdin)。

由于获取一次读取一个字符,因此您需要计算读取的字符数,并确保您不会离开可用空间的末尾'。这意味着你需要通过'尺寸'的。

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));