Ввод строки в указателе char

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    char *s;
    printf("enter the string : ");
    scanf("%s", s);
    printf("you entered %s\n", s);
    return 0;
}

Когда я предоставляю небольшие входы длиной до 17 символов (например, "aaaaaaaaaaaaaaaaa" ), программа работает отлично, но при предоставлении входов большей длины это дает мне ошибку времени выполнения, говоря: "main.c перестает работать неожиданно",

Есть ли какая-то проблема с моим компилятором (кодовыми блоками) или моим компьютером (windows 7)? Или это как-то связано с входным буфером C?

Ответ 1

Это undefined поведение, поскольку указатель не инициализирован. Там нет проблем с вашим компилятором, но ваш код имеет проблемы:)

Сделать s указывать на действительную память перед сохранением там данных.


Чтобы управлять переполнением буфера, вы можете указать длину в спецификаторе формата:

scanf("%255s", s); // If s holds a memory of 256 bytes
// '255' should be modified as per the memory allocated.

GNU C поддерживает нестандартное расширение, с которым вам не нужно выделять память, поскольку выделение выполняется, если указан %as, но должен быть передан указатель на указатель:

#include<stdio.h>
#include<stdlib.h>  

int main() {
  char *s,*p;

  s = malloc(256);
  scanf("%255s", s); // Don't read more than 255 chars
  printf("%s", s);

  // No need to malloc `p` here
  scanf("%as", &p); // GNU C library supports this type of allocate and store.
  printf("%s", p);
  free(s);
  free(p); 
  return 0;
}

Ответ 2

указатель char не инициализирован, вы должны динамически выделять ему память,

char *s = malloc(sizeof(char) * N);

где N - максимальный размер строки, который вы можете прочитать, и его небезопасно использовать scanf без указания максимальной длины для входной строки, используйте ее так:

scanf("%Ns",s);

где N такой же, как для malloc.

Ответ 3

Вы не выделяете память массиву символов, поэтому сначала попытайтесь получить память, вызвав malloc() или calloc(). затем попробуйте использовать его.

s = malloc(sizeof(char) * YOUR_ARRAY_SIZE);
...do your work...
free(s);

Ответ 4

Вам нужно выделить достаточно памяти для буфера, где ваш указатель будет указывать на:

    s = malloc(sizeof(char) * BUF_LEN);

а затем освободите эту память, если она вам больше не понадобится:

    free(s);

Ответ 5

Вы не выделяете память для своей строки, и, таким образом, вы пытаетесь записать ее на неавторизованный адрес памяти. Здесь

char *s;

Вы просто объявляете указатель. Вы не указываете, сколько памяти зарезервировано для вашей строки. Вы можете статически объявить это следующим образом:

char s[100];

который зарезервирует 100 символов. Если вы выйдете за пределы 100, он по-прежнему будет терпеть крах, как вы упомянули по той же причине снова.

Ответ 6

Проблема с вашим кодом.. вы никогда не выделяете память для char *. Поскольку нет выделенной памяти (с malloc()), достаточно большой, чтобы удерживать строку, это становится undefined.

Вы должны выделить память для s, а затем использовать scanf() (я предпочитаю fgets())

Ответ 7

В c++ вы можете сделать это следующим образом

 int n;
 cin>>n;
 char *a=new char[n];
 cin >> a;

Ответ 8

Код на C для чтения символьного указателя

#include<stdio.h>
 #include<stdlib.h>
 void main()
 {
    char* str1;//a character pointer is created 
    str1 = (char*)malloc(sizeof(char)*100);//allocating memory to pointer
    scanf("%[^\n]s",str1);//hence the memory is allocated now we can store the characters in allocated memory space
    printf("%s",str1);
    free(str1);//free the memory allocated to the pointer
 }

Ответ 9

Как это происходит? Может кто-нибудь объяснить, пожалуйста.

Ясно, что строки являются неизменяемыми, поэтому я добавил const, предшествующий объявлению указателя на символ. Не могу понять, как указатель char обращается ко всей строке char. Поскольку указатель указывает на начало массива char (строки). Но как это хранить.

Пример кода

Ответ 10

#include"stdio.h"
#include"malloc.h"

int main(){

        char *str;

        str=(char*)malloc(sizeof(char)*30);

        printf("\nENTER THE STRING : ");
        fgets(str,30,stdin);

        printf("\nSTRING IS : %s",str);

        return 0;
}