在c中实现gets()

时间:2016-08-30 02:24:35

标签: c linux

#include<iostream.h>
#include<stdlib.h>

using namespace std;

char*   Gets(char *s)
{
  char ch,*p;
  p=s;
  while ( (ch=getchar()) != '0' )
  {
   *s=ch;
   s++;
  }
 s='\0';
 return p; //return the address of S stored in P.

}

int main(int argc,char* argv[])
{
  //char s[200];
  char *s;
  s=Gets(s);
  cout<<"\n After Gets Value of S=["<<s<<"] \n";
  return 0;
}

如果我使用char *s我将输出作为

  

分段错误:11

如果我使用char s[200]则没有错误。为什么我会出现分段错误?

2 个答案:

答案 0 :(得分:2)

字符串没有内存分配。声明char *s;只是分配一个指向字符串的指针,而不是字符串本身。请改为char s[<some number>];

同样s = '\0';应该是*s = 0;

最后s = Gets(s);应该只是Gets(s);,因为你传递了一个指向已分配内存的指针。

答案 1 :(得分:2)

  

为什么我会出现分段错误。

代码没有正确终止字符数组s='\0';,也没有使用char *s;分配内存

从C11开始,

gets()不再是标准C库的一部分。使用它不是强大的编程,因为它不会阻止缓冲区溢出。

OP可能想要以下内容。更正指出。

char *Gets(char *s) {
  // Use int to distinguish the typical 257 different returns values of getchar() 
  int ch;
  char *p = s;

  // stop when a \n or EOF encountered 
  // while ( (ch=getchar()) != '0' )
  while ( (ch=getchar()) != '\n' && ch != EOF) {
    // Note lack of check for adequate array space
    *s = (char) ch;
    s++;
  }

  // Append a null character, not assign a zero to the pointer
  // s='\0';
  *s = '\0';
  return p;
}

int main(void) {
  // Use an array, not an unassigned character pointer
  char s[200];
  // char *s;

  // Cannot assign to an array
  // s=Gets(s);
  Gets(s);

  // Use C code
  //cout<<"\n After Gets Value of S=["<<s<<"] \n";
  printf("\n After Gets Value of S=[" "%s" "] \n", s); 
  return 0;
}