#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]
则没有错误。为什么我会出现分段错误?
答案 0 :(得分:2)
字符串没有内存分配。声明char *s;
只是分配一个指向字符串的指针,而不是字符串本身。请改为char s[<some number>];
。
同样s = '\0';
应该是*s = 0;
。
最后s = Gets(s);
应该只是Gets(s);
,因为你传递了一个指向已分配内存的指针。
答案 1 :(得分:2)
为什么我会出现分段错误。
代码没有正确终止字符数组s='\0';
,也没有使用char *s;
分配内存
gets()
不再是标准C库的一部分。使用它不是强大的编程,因为它不会阻止缓冲区溢出。
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;
}