Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 19.09.2019
Сообщений: 47
1

Массив: Почему у меня при выводе массива отражаются только первые символы каждой строки, а не вся она целиком?

04.11.2019, 23:13. Показов 3050. Ответов 31

Author24 — интернет-сервис помощи студентам
почему у меня при выводе массива отражаются толко первые символы каждой строки а не вся она целиком? как это исправить?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main()
{
char line[10];
int n,i;
printf("vvedi n\n");
scanf("%d",&n);
 
 
for(i=0;i<n;i++)
{
  printf("line[%d]=\n",i);
  scanf("%s", &line[i]);
} 
printf ("\n");
   
   for (i=0;i<n;i++)    
            {printf("%c ", line[i]);
      printf ("\n");
      }
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2019, 23:13
Ответы с готовыми решениями:

Лишние символы при выводе только что считанного массива
Доброй ночи. При выполнении одного из заданий столкнулся с тем, что паскаль при считывании...

Почему при вводе строки с пробелом программа считывает только символы до пробела?
#include &lt;iostream&gt; using namespace std; int main() { string T; int S=0, i,d,...

Дан текстовый файл. Напечатать первые символы каждой строки
Дан текстовый файл. Напечатать первые символы каждой строки

Дано целое число K и текстовый файл. Удалить из каждой строки файла первые K символов (если длина строки меньше K, то удалить из нее все символы)
Помогите Пожалуйста написать программу! Дано целое число K и текстовый файл. Удалить из каждой...

31
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
05.11.2019, 18:21 21
Author24 — интернет-сервис помощи студентам
мама Стифлера, сделай так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
 
#define ST 4 //kol-vo strok
#define DL 5 //dlind strori
int main(void) {
    char cislo[ST][DL]; int i = 0;
    char *p;
    for (i = 0; i < ST; i++) {
        fgets(cislo[i], DL, stdin);
        if (p = strchr(cislo[i], '\n'))
            *p = 0;
        else
        {
            scanf("%*[^\n]");
            scanf("%*c");
        }
        printf("%s\n", cislo[i]);
    }
}
Добавлено через 3 минуты
Кстати, просмотри Распространенные ошибки в Си. Полагаю, найдешь много полезного...
1
0 / 0 / 0
Регистрация: 19.09.2019
Сообщений: 47
05.11.2019, 18:52  [ТС] 22
огромное спасибо!!!
а можно задать вам еще один вопрос? каким образом можно вывести на экран определенные строки, которые удовлетворяют заданному условию? например: ввести ряд строк и из этих строк вывести на экран только те, которые начинаются с буквы "b"?
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
05.11.2019, 18:59 23
Ponchic220, строки в каком виде? Если в виде матрицы, то пройтись в цикле по первому индексу. Сравниваешь первый символ (фактически первый столбец матрицы) с 'b'. Если равно - выводишь...

Добавлено через 1 минуту
Надеюсь, Вы из разговора с мамой Стифлера нашли ответы на свои вопросы?
1
0 / 0 / 0
Регистрация: 19.09.2019
Сообщений: 47
05.11.2019, 19:08  [ТС] 24
да, вы мне очень помогли!
а если в этот же код вписать
C
1
2
3
4
5
6
for (i=0;i<n;i++)
    {
    if (line[i][0] =='b')
      puts( line[i]);
      else printf ("\n");
    }
то вс нормально? никак не пойму как обратиться к этому первому символу в строке... вроде бы так
(эту часть хочу вставить в код
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
#include <stdio.h>
 
int main()
{
char line[10][10];
int n,i;
printf("vvedi n\n");
scanf("%d",&n);
 
for(i=0;i<n;i++)
{
  printf("line[%d]=\n",i);
  scanf("%s", line[i]);
  fgets(line[i], 10, stdin);
}
printf ("\n");
 
   for (i=0;i<n;i++)
   {
     printf("%s ", line[i]);
     printf ("\n");
    }
 
   for (i=0;i<n;i++)
    {
    if (line[0] == 'b')
      puts( line);
      else printf ("\n");
    }
  
return 0;
}
0
из племени тумба-юбма
2467 / 1790 / 417
Регистрация: 29.11.2015
Сообщений: 8,692
Записей в блоге: 15
05.11.2019, 19:12 25
liv, эмм... оно работает, только не понятно как
В общем решил пока не заострять внимание на этом, по мере изучения думаю будет понятна логика ))
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
05.11.2019, 19:22 26
Лучший ответ Сообщение было отмечено Ponchic220 как решение

Решение

Ponchic220, line - матрица, поэтому обращаться к элементам (символам) матрицы надо при помощи двух индексов, т.е line[i][0] обратится к первому символу i-й строки.
Подправленный код, с учетом всего выше сказанного:
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
#include <stdio.h>
#include <string.h>
 
int main()
{
    char line[10][10];
    char *p;
    int n, i;
    printf("vvedi n = ");
    scanf("%d", &n);
    scanf("%*c");
 
    for (i = 0;i < n;i++)
    {
        printf("line[%d]= ", i);
        fgets(line[i], 10, stdin);
        if (p = strchr(line[i], '\n'))
            *p = 0;
        else
        {
            scanf("%*[^\n]");
            scanf("%*c");
        }
    }
    printf ("\n");
 
    for (i = 0;i < n;i++)
        printf("%s\n", line[i]);
 
    printf ("\n");
 
    for (i = 0;i < n;i++)
    {
        if (line[i][0] == 'b')
            puts(line[i]);
        else 
            printf ("\n");
    }
 
    return 0;
}
Добавлено через 2 минуты
мама Стифлера,
C
1
2
3
4
            strchr(line[i], '\n')  //ищем в строке символ '\n'
//если найден - заменяем на 0, иначе выгребаем поток
            scanf("%*[^\n]");  //убирается из потока все символы до '\n'
            scanf("%*c"); //убирается из потока символ '\n'
2
0 / 0 / 0
Регистрация: 19.09.2019
Сообщений: 47
05.11.2019, 19:24  [ТС] 27
большое спасибо Вам!!
0
мама Стифлера
05.11.2019, 19:50
  #28

Не по теме:

В этом плане, Си даже интересней, чем Си++. Так как в Си нет всяких облегчающих плюшек, поэтому приходится колхозить, кто как может )))

0
1212 / 706 / 335
Регистрация: 22.02.2018
Сообщений: 2,059
Записей в блоге: 2
06.11.2019, 00:32 29
Цитата Сообщение от мама Стифлера Посмотреть сообщение
оно переходит на другую строку.
Так и будет, fgets контролирует длину буфера строки и по его исчерпыванию завершает ввод символом '\0'
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
06.11.2019, 01:00 30
мама Стифлера, намекну:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void) {
    int i = 1234;
    char s[5];
 
    scanf("%s", s);
    printf("%s\n%d\n", s, i);
 
    return 0;
}
Код
[andrew@easybook string]$ gcc -Wall before_and_after.c 
[andrew@easybook string]$ ./a.out 
abcdefghijklmn 
abcdefghijklmn
28269
[andrew@easybook string]$
Добавлено через 4 минуты
Цитата Сообщение от TrollHammer Посмотреть сообщение
Так и будет, fgets контролирует длину буфера строки и по его исчерпыванию завершает ввод символом '\0'
scanf так тоже умеет, если его использовать правильно
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void) {
    int i = 1234;
    char s[5];
 
    scanf("%4s", s);
    printf("%s\n%d\n", s, i);
 
    return 0;
}
Код
[andrew@easybook string]$ ./a.out 
abcdefghijklmn
abcd
1234
[andrew@easybook string]$
1
Вездепух
Эксперт CЭксперт С++
11697 / 6376 / 1724
Регистрация: 18.10.2014
Сообщений: 16,080
06.11.2019, 10:25 31
Цитата Сообщение от мама Стифлера Посмотреть сообщение
но почему тогда при printf("%s ", line); он печатает всю строку, ведь должен всего 5, или даже 4(последний \0)?
Какой "последний \0"? Покажите, где вы в вашем коде занесли в ваш массив этот "последний \0"? А если вы его туда не заносили, то откуда он там возьмется?

Ваша программа печатает белиберду потому, что формат %s требует на вход строку. Ваша line строкой не является. Поведение вашего кода не определено.

Цитата Сообщение от мама Стифлера Посмотреть сообщение
и лучше использовать gets()?
Нет уже давно никакого gets. А что "лучше использовать" зависит от того, что вы хотите получить. scanf выполняет форматированный ввод. fgets выполняет построчное чтение.
0
из племени тумба-юбма
2467 / 1790 / 417
Регистрация: 29.11.2015
Сообщений: 8,692
Записей в блоге: 15
06.11.2019, 12:37 32
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какой "последний \0"? Покажите, где вы в вашем коде занесли в ваш массив этот "последний \0"
Так я думал, что если ставлю ограничение 5
Цитата Сообщение от мама Стифлера Посмотреть сообщение
char line[5];
scanf("%s", line);
printf("%s ", line);
то должно автоматом ставится \0 в конец последней строки Ну ладно, понял пока не нажмешь Enter, конца строки не будет.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет уже давно никакого gets
А это почему, fgets же есть?
0
06.11.2019, 12:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2019, 12:37
Помогаю со студенческими работами здесь

Массив: Переписать первые элементы каждой строки матрицы D(3,3), которые больше 10, в массив В.
Переписать первые элементы каждой строки матрицы D(3,3), которые больше 10, в массив В.

Вывести четные строки и вывести первые символы каждой строки
Дан пример: 1.идет бычок качется 2.вздыхая на ходу 3.ох доска кончается 4.сейчас я упаду нужно...

Вывести исходные данные в первые 4 строки и 3 первые столбца. вычислить среднее арифметическое элементов каждой строки
Матрица : Х(5,4), Вывести исходные данные в первые 4 строки и 3 первые столбца.. вычислить среднее...

При выводе строки в терминал выводятся неизвестные символы
Всем привет, при выводе строки в терминал выводит на следующую строку какие-то символы(последняя...

Лишние символы новой строки при выводе из файла
Здравствуйте! При выводе из файла печатаются лишние символы новой строки. Подскажите, пожалуйста,...

Массив: на входе принимается двухмерный массив 4х7, а выводит только две первые строки
Ребят, выручайте. Нужно написать com-программу, которая на входе принимает ведённый двухмерный...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru