2016-08-30 1 views
2
#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] ошибки нет. Почему я получаю ошибку сегментации?

+1

Вам необходимо выделить память в куче Irvin, чтобы удерживать 200 символов. –

+2

'using namespace std;' и 'cout <<" \ n После получения значения S = ["<< s <<"] \ n ";' не является кодом C – chux

+0

Вы действительно хотите закончить строку, когда она читает символ ''0''? – Dmitri

ответ

2

Нет выделения памяти для строки. Объявление char *s; просто выделяет указатель на строку, а не на строку. Вместо этого попробуйте char s[<some number>];.

Также s = '\0'; должно быть примерно *s = 0;.

Последнее, что s = Gets(s); должно быть Gets(s);, поскольку вы передаете указатель на выделенную память.

2

Почему я получаю ошибку сегментации.

код не корректно завершить массив символов s='\0'; и не использовать назначения памяти с char *s;


gets(), по состоянию на С11, больше не является частью стандартной библиотеки 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; 
} 
Смежные вопросы