Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
kveigs
16 / 16 / 2
Регистрация: 20.03.2010
Сообщений: 85
#1

Как поместить в массив строк строку - C++

18.07.2011, 17:31. Просмотров 2076. Ответов 15
Метки нет (Все метки)

Есть такой вот массив char s[20][200]; ну или char** s; я никак не могу разобраться в этих указателях((
1.Как поместить в него строку
2.Как извлечь из него строку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2011, 17:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как поместить в массив строк строку (C++):

Как поместить строку в двумерный массив строк - C++
как поместить строку в двумерный массив строк (статичный)? то есть, например, в каждую строку хочу писать только одно слово

Поместить строку в массив - C++
Всем доброго время суток! Помогите пожалуйста разобраться с проблемой. Мне нужно поместить строку содержащуюся в переменной в массив....

Считать строки файла и поместить в динамический массив строк - C++
Ребята помогите. Нужно считать с файла, в котором 1 строка - 1 слово, строки и поместить их в динамический массив строк типа char...

Объявлен массив строк. Как вывести на экран третью строку? - C++
char lines; char *pl = lines; a. cout << pl+3; b. cout << *(pl+3); c. cout << pl + 3*10; d. cout << pl +...

Строку в массив строк - C++
Здравствуйте, написал функцию, которая записывает слово, как отдельный элемент массива, но я получаю ошибку Debug Assertion Failed ...

Массив строк преобразовать в строку - C++
как преобразовать массив строк в строку через разделитель, то есть дано: "строка1" "строка2" "строка3" а нужно получить "строка1,...

15
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
18.07.2011, 18:09 #2
Цитата Сообщение от kveigs Посмотреть сообщение
Есть такой вот массив char s[20][200]; ну или char** s; я никак не могу разобраться в этих указателях((
1.Как поместить в него строку
2.Как извлечь из него строку
Поместить можно разными способами: sprintf, scanf, strcpy и тд. для этого есть... Смотря откуда и куда
C
1
2
3
4
5
6
char s[20][200];
for ( int i =0; i < 20; i++ )
{
   printf ("Введите строку № %d \n", i +1);
   scanf ( "%s", s[i]);
}
А извлечь это что значит ? На экран вывести, копировать в другую строку или в файл ?
C
1
2
3
char s[20][200];
for ( int i =0; i < 20; i++ )
   printf ("Строка № %d : %s \n", i+1, s[i]);
1
kveigs
16 / 16 / 2
Регистрация: 20.03.2010
Сообщений: 85
18.07.2011, 18:22  [ТС] #3
спасибо за strcpy)
C++
1
2
s[i] = new char[MAX_PATH];
strncpy(s[i], "la-la-la", MAX_PATH);
0
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,776
19.07.2011, 01:25 #4
kveigs, на всякий случай: у strncpy есть одна неприятная особенность. Проверьте вывод этой програмки
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
 
int main(void){
    char a[] = "abcdefgh";
    char b[] = "11111111";
    
    strncpy(b, a, 3);
    printf("%s\n", b);
    
    return 0;
}
0
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
19.07.2011, 19:39 #5
easybudda, А в чем она не приятна ? По-моему очень логичная особенность... мы заменили первые 3 элемента строки элементами из другой строки, а остальные остались не изменными. Это ведь простое копирование.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
  string a = "abcdefgh";
  string b = "11111111";
 
  copy ( a.begin(), a.begin()+3, b.begin());
  cout << b.c_str()<< endl;
 
  return 0;
}
Тут вывод будет аналогичным
0
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,776
19.07.2011, 22:07 #6
Цитата Сообщение от An1ka Посмотреть сообщение
А в чем она не приятна ?
вот так
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
 
int main(void){
    char a[] = "ab";
    char b[] = "11111111";
    
    strncpy(b, a, 3);
    printf("%s\n", b);
    
    return 0;
}
попробуйте.
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
01.08.2011, 20:27 #7
Цитата Сообщение от easybudda Посмотреть сообщение
вот так
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
 
int main(void){
    char a[] = "ab";
    char b[] = "11111111";
    
    strncpy(b, a, 3);
    printf("%s\n", b);
    
    return 0;
}
попробуйте.
ну все логично, по символьно скопировали, из a 3 символа, "a","b","\0", в чем её вина?
0
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,776
01.08.2011, 21:18 #8
Ну может так понятнее будет...
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
int main(void){
    char buf[5];
    
    strncpy(buf, "abcdefgh", 5);
    printf("%s\n", buf);
    
    return 0;
}
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
01.08.2011, 21:32 #9
easybudda, вы про завершающий ноль чтоли?
а то я что-то тоже не могу проблему найти...
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
01.08.2011, 21:47 #10
Цитата Сообщение от easybudda Посмотреть сообщение
Ну может так понятнее будет...
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
int main(void){
    char buf[5];
    
    strncpy(buf, "abcdefgh", 5);
    printf("%s\n", buf);
    
    return 0;
}
и опять же ошибки со стороны функции так и нет.
Может объясните свою точку зрения?)
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
01.08.2011, 21:53 #11
silentnuke, а про ошибку никто и не говорил. Неприятная особенность этой функции, это то, что другие подобные функции завершающий ноль, как правило, вставляют.
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
01.08.2011, 21:58 #12
Цитата Сообщение от grizlik78 Посмотреть сообщение
silentnuke, а про ошибку никто и не говорил. Неприятная особенность этой функции, это то, что другие подобные функции завершающий ноль, как правило, вставляют.
ну а если у вас есть дальше продолжение строки, как раз то что она вставит \0 будет куда хуже.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
01.08.2011, 22:02 #13
под подобными я подразумеваю strncat, snprintf и другие, где максимальный размер задаётся явно.
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
01.08.2011, 22:17 #14
Цитата Сообщение от grizlik78 Посмотреть сообщение
под подобными я подразумеваю strncat, snprintf и другие, где максимальный размер задаётся явно.
ну для этого есть документация, где явно указано:
strncpy - Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.

No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num.
strncat - Appends the first num characters of source to destination, plus a terminating null-character. If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.
и то что strncpy не добавляет \0 как раз правильно.
ибо там может быть продолжение.
а strncat, по названию понятно что добавляет в конец строки, и поэтому логично, что должна добавлять \0.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
01.08.2011, 22:22 #15
Собственно код, из-за которого всё началось, как раз и показывает, что ТС бездумно использовал эту функцию:
C++
1
2
s[i] = new char[MAX_PATH];
strncpy(s[i], "la-la-la", MAX_PATH);
Здесь ожидаемой выгоды использование strncpy не даёт. Если ошибиться с размером константной строки, то от переполнения буфера в этом месте мы защищаемся, но провоцируем возможность выхода за границу в дальнейшем.
Я хорошо помню, что эта строчка у ТС появилась после моего примера, где функция использовалась для копирования из буфера с размером MAX_PATH в буфер с таким же размером. Там strncpy не может что-либо испортить.
Так что то, что easybudda обратил внимание ТС на особенность этой функции мне кажется вполне логичным.

Добавлено через 3 минуты
Цитата Сообщение от silentnuke Посмотреть сообщение
ну для этого есть документация, где явно указано:
Спасибо, я и сам читаю документацию. Почти каждый раз при использовании этих функций.

Цитата Сообщение от silentnuke Посмотреть сообщение
и то что strncpy не добавляет \0 как раз правильно.
ибо там может быть продолжение.
а strncat, по названию понятно что добавляет в конец строки, и поэтому логично, что должна добавлять \0.
Это всего лишь точка зрения. Но дебаты о том, как должны работать эти функции всё-равно бесполезны, так как функции уже реализованы и задокументированы.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 22:22
Привет! Вот еще темы с ответами:

Динамический массив строк (вставить строку с номером к) - C++
Написал программу,задача была сформировать динамический массив и вставить строку с номером к.(вводить пользователь).Никак не пойму как...

Массив строк и найти в нем максимальную по длине строку - C++
Ввести массив строк и найти в нем максимальную по длине строку. Не учитывать случай, когда таких строк несколько.

Сформировать массив строк. Удалить из него самую короткую строку - C++
Помогите пожалуйста. Сформировать массив строк. Удалить из него самую короткую строку

Сформировать массив строк. Удалить из него строку начинающуюся на букву «а» - C++
Сформировать массив строк. Удалить из него строку начинающуюся на букву «а». Пожалуйста помогите решить, заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
01.08.2011, 22:22
Ответ Создать тему
Опции темы

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