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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
kveigs
16 / 16 / 2
Регистрация: 20.03.2010
Сообщений: 85
18.07.2011, 17:31     Как поместить в массив строк строку #1
Есть такой вот массив char s[20][200]; ну или char** s; я никак не могу разобраться в этих указателях((
1.Как поместить в него строку
2.Как извлечь из него строку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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]);
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);
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
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;
}
Тут вывод будет аналогичным
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
попробуйте.
silentnuke
Android Programmer
137 / 138 / 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", в чем её вина?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
01.08.2011, 21:32     Как поместить в массив строк строку #9
easybudda, вы про завершающий ноль чтоли?
а то я что-то тоже не могу проблему найти...
silentnuke
Android Programmer
137 / 138 / 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;
}
и опять же ошибки со стороны функции так и нет.
Может объясните свою точку зрения?)
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 21:53     Как поместить в массив строк строку #11
silentnuke, а про ошибку никто и не говорил. Неприятная особенность этой функции, это то, что другие подобные функции завершающий ноль, как правило, вставляют.
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
01.08.2011, 21:58     Как поместить в массив строк строку #12
Цитата Сообщение от grizlik78 Посмотреть сообщение
silentnuke, а про ошибку никто и не говорил. Неприятная особенность этой функции, это то, что другие подобные функции завершающий ноль, как правило, вставляют.
ну а если у вас есть дальше продолжение строки, как раз то что она вставит \0 будет куда хуже.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 22:02     Как поместить в массив строк строку #13
под подобными я подразумеваю strncat, snprintf и другие, где максимальный размер задаётся явно.
silentnuke
Android Programmer
137 / 138 / 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.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
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.
Это всего лишь точка зрения. Но дебаты о том, как должны работать эти функции всё-равно бесполезны, так как функции уже реализованы и задокументированы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 22:28     Как поместить в массив строк строку
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
01.08.2011, 22:28     Как поместить в массив строк строку #16
Цитата Сообщение от grizlik78 Посмотреть сообщение
Это всего лишь точка зрения. Но дебаты о том, как должны работать эти функции всё-равно бесполезны, так как функции уже реализованы и задокументированы.
согласен, просто не так понял про неприятную особенность.

Не по теме:

если кого обидел, извиняюсь, не хотел=)

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

Текущее время: 21:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru