Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Amazzing
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 2
1

Как ввести строку которая хранится по указателю

04.02.2018, 17:28. Просмотров 212. Ответов 10
Метки нет (Все метки)

Как я понял строку можно хранить в массиве типа
C
1
char
или по указателю но когда я питаюсь ввести строку-указатель с помощью
C
1
scanf()
программа не работает.Как можно ввести строку которая хранится по указателю?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#define size 40 
int main()
{
    char *ptr = "it is pointer";
    char arr[size] = "it is array";
    printf("string(arr) : %s\n", arr);
    printf("string(ptr) : %s\n", ptr);
    printf("Enter string(arr) :");
    scanf("%s", arr);
    printf("Enter string(ptr) :");
    scanf("%s", ptr);//не помещает строку по  указатель ptr
    printf("string(arr) : %s\n", arr);
    printf("string(ptr) : %s\n", ptr);
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2018, 17:28
Ответы с готовыми решениями:

Char*str = "Hello, world"; Указатель, указывающий на эту строку, хранится в стэке, а где хранится сама строка?
нужно ли освобождать память, выделенную под str?

Как ввести строку с клавиатуры?
Как в Си можно ввести строку с клавиатуры? Добавлено через 17 минут 22...

Как ввести символьную строку в switch
Решая задачу наткнулся на такую проблему. У меня VS 2013 Ult. Вся программа...

Не могу ввести строку как пользователь
Здравствуйте. Подскажите, плз, в чем ошибка, в строках 27-28 вводится запрос...

Создать симметричную матрицу которая хранится в одномерном массиве
Хочу создать симметричную матрицу которая хранится в одномерном массиве, где...

10
Заблудившийся
3 / 3 / 2
Регистрация: 20.12.2017
Сообщений: 9
04.02.2018, 18:54 2
Цитата Сообщение от Amazzing Посмотреть сообщение
char *ptr = "it is pointer";
Здесь ptr указывает на область памяти, которая доступна только для чтения. Поэтому записать туда ничего и не получается на строке 12.
1
nezabudka
679 / 261 / 99
Регистрация: 28.06.2015
Сообщений: 666
Записей в блоге: 11
04.02.2018, 22:43 3
C
1
2
char *ptr;
ptr = (char *)malloc(sizeof(char) * BUFSIZ);
Добавлено через 3 минуты
C
1
2
3
4
char buf[BUFSIZ];
char *p = buf;
strcpy(p, "hello world!");
printf("%s\n", p);
0
stake-k26
365 / 308 / 256
Регистрация: 25.04.2016
Сообщений: 912
05.02.2018, 04:04 4
scanf для этого не очень хорошо подходит, вернее вообще не походит, лучше использовать fgets(), например:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
// максимальная длина строки:
#define BUFFERSIZE 256
 
int main (void)
{
    char str[BUFFERSIZE];                   // массив размера BUFFERSIZE
    printf("Input your string here: ");     // печатаем приглашение
    fgets(str, BUFFERSIZE, stdin);          // получаем строку с клавиатуры (не больше BUFFERSIZE)
    if (str == NULL) return -1;             // если строка не записана, выходим
    printf("Your string is: %s", str);      // выводим строку на экран
    return 0;
}
Добавлено через 8 минут
Понятно, что после этого, мы можем спокойно обращаться к строке по указателю, например, напишем функцию, которая будет подсчитывать длину строки:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int str_len (char *);   // длина строки
 
// максимальная длина строки:
#define BUFFERSIZE 256
 
int main (void)
{
    char str[BUFFERSIZE];                   // массив размера BUFFERSIZE
    printf("Input your string here: ");     // печатаем приглашение
    // получаем строку с клавиатуры, если строка не записана, выходим:
    if (fgets(str, BUFFERSIZE, stdin) == NULL) return -1;
    printf("Your string is: %s", str);      // выводим строку на экран
 
    // определим длину строки:
    int l = str_len(str);
    printf("Lengh of string is %d\n", l);   // выводим длину строки на экран
    return 0;
}
// -------- длина строки: --------
int str_len (char * s)
{
    int i = 0;
    while (s[i] != 0) i++;
    return i;
}
Добавлено через 1 час 5 минут
Amazzing, если отвечать непосредственно на ваш вопрос, то код программы получается несколько великоват. Т.е. нам нужно использовать динамический массив, объявленный через указатель. Считывать символ с потока ввода, рассчитывать новый размер массива и записывать символ в него. После чего возвращать указатель на получившийся массив. Например, так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>      //предоставляет: fgetc, stdin
#include <stdlib.h>     //sizeof, free, realloc, malloc
#include <string.h>     //strcmp, strncpy
 
char * getstring (void);    // строка с клавиатуры
 
int main (void)
{
    char * s;               // указатель на будущую строку
    printf("Input your string here:\n");
    s = getstring();        // получаем строку с клавиатуры
    if (s == NULL)  return -1;
 
    printf("%s\n", s);  // строку на экран
    free(s);                    // освобождаем память, занятую строкой
    return 0;
}
// --------------------- получаем строку с клавиатуры ---------------------
char * getstring (void)
{
    char * buffer = NULL;                   //буфер для хранения символов
    unsigned int capacity = 0;              //размер буфера
    unsigned int n = 0;                     //сколько символов в буфере
    int bitofchar = sizeof(char);           //сколько бит в одном char
    int MAX_LEN = 2048;                     //1 строка максимум 4 Мб (MAX_LEN*2)
    int c;                                      //сюда записываем символы
 
    // получаем символы
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
    {
        if (n + 1 > capacity)               //проверяем размер буфера
        {
            if (!capacity) capacity = 32; //по умолчанию 32 символа
            else if (capacity <= MAX_LEN) capacity *= 2;
            else                                    //угроза переполнения буфера
            {
                free(buffer);
                return NULL;
            }
            // меняем размер буфера в памяти
            char* temp = (char*) realloc(buffer, capacity * bitofchar);
            if (temp == NULL)
            {
                free(buffer);
                return NULL;
            }
            buffer = temp;
        }
        // заносим символ в буфер
        buffer[n++] = c;
    }
    if (n == 0 && c == EOF) return NULL;//если пустая строка, вернем NULL
 
    // минимизируем размер буфера
    char * minimal = (char*) malloc((n + 1) * bitofchar);
    strncpy(minimal, buffer, n);
    free(buffer);                               //освобождаем память
    minimal[n] = '\0';                      //добавляем конец строки
 
    return minimal;                         //возвращаем получившуюся строку
}
В этом примере размер строки ограничен 4096 символами, однако это далеко не предел, мы можем ограничение и в 2 000 000 символов установить, просто я не представляю как кто-нибудь примется вводить с клавиатуры такую монструозную строку.
0
COKPOWEHEU
991 / 689 / 156
Регистрация: 09.09.2017
Сообщений: 2,973
05.02.2018, 09:36 5
Цитата Сообщение от stake-k26 Посмотреть сообщение
scanf для этого не очень хорошо подходит, вернее вообще не походит, лучше использовать fgets(), например:
Это чем scanf не угодил?
0
stake-k26
365 / 308 / 256
Регистрация: 25.04.2016
Сообщений: 912
05.02.2018, 11:35 6
COKPOWEHEU, тем, что он любой пробел или таб воспринимает как конец ввода, т.е. через %s ты сможешь ввести только одно слово, и после этого придется еще и поток ввода очищать от мусора.
0
COKPOWEHEU
991 / 689 / 156
Регистрация: 09.09.2017
Сообщений: 2,973
05.02.2018, 12:30 7
Если нужна "просто строка" из произвольного набора символов то да, но ведь чаще нужно ее делить на числа, разделительные символы, отдельные слова.
0
stake-k26
365 / 308 / 256
Регистрация: 25.04.2016
Сообщений: 912
05.02.2018, 12:31 8
COKPOWEHEU, задание читаем, оно где-то там наверху черным по белому писано...
0
nezabudka
679 / 261 / 99
Регистрация: 28.06.2015
Сообщений: 666
Записей в блоге: 11
05.02.2018, 12:42 9
C
1
2
3
char buf[80];
scanf("%79[^\n]", buf);
printf("%s\n", buf);
0
COKPOWEHEU
991 / 689 / 156
Регистрация: 09.09.2017
Сообщений: 2,973
05.02.2018, 14:08 10
Цитата Сообщение от stake-k26 Посмотреть сообщение
COKPOWEHEU, задание читаем, оно где-то там наверху черным по белому писано...
А можно ссылку? В первом посте задания нет, в других вроде тоже
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,558
Записей в блоге: 2
Завершенные тесты: 1
06.02.2018, 11:58 11
Scanf() для строки любого размера
0
06.02.2018, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2018, 11:58

Ввести строку и слово, удалить все вхождения слова и вывести строку
Нужно написать программу только со стандартной библиотекой &lt;stdio.h&gt; Помогите,...

Ввести строку и слово, удалить все вхождения слова и вывести строку
Доброго времени суток всем ! написал лр2 (Ввести строку и слово, удалить все...

Ввести строку и слово, удалить все вхождения слова и вывести строку
Написал код. Вот условие: &quot;Ввести строку и слово, удалить все вхождения слова и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru