This is my code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(int arge, char *argv[])
{
FILE *f1;
char ch,*fn="~/lyrics/";
strcat(fn,argv[1]);
strcat(fn,".txt");
if( (f1 = fopen(fn,"r"))==NULL )
{
printf("nWrong filenamen%s not found",argv[1]);
return;
}
while((ch=getw(f1))!=EOF)
{
printf("%c",ch);
}
}
I compiled it using gcc -g -o file file.c and the compiler gave no error messages. But when I run it I get the error message:
Segmentation fault (core dumped)
Bad permissions for mapped region at address 0x8048659 at 0x402C36B: strcat
(in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) by 0x80484D6: main (lyrics.c:9)
Can anyone please help me?
David Guyon
2,6511 gold badge28 silver badges39 bronze badges
asked Dec 16, 2012 at 12:18
![]()
Mahesh BansodMahesh Bansod
1,1111 gold badge20 silver badges35 bronze badges
5
You don’t have enough space in fn. By strcat’ing on to it you overwrite the end of its stack allocation and into the stack .. hence the segmentation fault.
You could try the following instead:
char fn[255];
strcpy( fn, "~/lyrics/" );
strcat( fn, argv[1] );
strcat( fn, ".txt" );
You just have to be sure that the whole path and filename can fit into 255 characters.
Alternatively you could do this:
char* fn = NULL;
int argvLen = strlen( argv[1] );
fn = malloc( 9 + argvLen + 4 + 1 ); // Add 1 for null terminator.
strcpy( fn, "~/lyrics/" );
strcat( fn, argv[1] );
strcat( fn, ".txt" );
And you have definitely allocated enough space for the string. Just don’t forget to free it when you have finished with it!
answered Dec 16, 2012 at 12:19
1
char *fn = "~/lyrics/";
Because fn could point on a string in read-only memory, you should declare fn as pointer to const char.
const char *fn = "~/lyrics/";
Then you can see there are some errors. Here is a better solution:
char fn[MAX_SIZE] = "~/lyrics/";
Here MAX_SIZE shall be the sum of the size of "~/lyrics/", the maximum length of argv[1] and the length of ".txt".
answered Dec 16, 2012 at 12:19
md5md5
23.3k3 gold badges44 silver badges93 bronze badges
1
This approach is not portable.
If using glibc you also might call asprintf() which just allocates as much memory as you need.
#include <stdio.h>
...
char * pFn = NULL;
if (-1 == asprintf(&pFn, "~/lyrics/%s.txt", argv+1);
{
perror("asprintf()");
}
else
{
... /* use pFn */
}
free(pFn);
...
answered Dec 16, 2012 at 12:26
![]()
alkalk
69.2k10 gold badges98 silver badges248 bronze badges
Недавно я начал работать над изучением языка Си и неоднократно сталкивался с ошибкой, при которой вызов функции strcat из модуля <string.h> приводит к ошибке сегментации. Я искал ответы в Интернете, в том числе в этом сообщении stackoverflow, но безуспешно. Я думал, что у этого сообщества может быть более личное понимание проблемы, поскольку общие решения, похоже, не работают. Может быть ошибка пользователя, может быть личная проблема с кодом. Взглянуть.
#include <stdio.h>
#include <string.h>
char * deblank(const char str[]){
char *new[strlen(str)];
char *buffer = malloc(strlen(new)+1);
for (int i=0; i<strlen(*str); i++){
if(buffer!=NULL){
if(str[i]!=" "){
strcat(new,str[i]); //Segmentation fault
}
}
}
free(buffer);
return new;
}
int main(void){
char str[] = "This has spaces in it.";
char new[strlen(str)];
*new = deblank(str);
puts(new);
}
Я разместил комментарий в строке, в которой проследил ошибку сегментации. Ниже приведен пример использования Java-кода в этом C-коде.
public class deblank {
public static void main(String[]args){
String str = "This has space in it.";
System.out.println(removeBlanks(str));
}
public static String removeBlanks(String str){
String updated = "";
for(int i=0; i<str.length(); i++){
if(str.charAt(i)!=' '){
updated+=str.charAt(i);
}
}
return updated;
}
}
Любое понимание этой ошибки будет высоко ценится. Пожалуйста, укажите также опечатки … Я был известен, чтобы сделать их. Спасибо.
6 ответов
Лучший ответ
Вы не можете использовать strcat так, как вы это делали, оно предназначено для преобразования C-строки в конец другой данной строки. str[i] является символом, а не C-строкой (помните, что C-строка представляет собой непрерывную последовательность символов, последним из которых является байт NUL).
Вы также не можете сравнивать строки со стандартными операторами сравнения, если вам действительно нужно сравнивать строки, то для этого есть функция strcmp. Но вы можете сравнивать символы со стандартными операторами, так как char — это просто целочисленный тип.
Это должно сделать трюк:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * deblank(const char str[]) {
char *buffer = malloc(strlen(str)+1); // allocate space to contains as much char as in str, included ending NUL byte
for (int i=0, j=0; i<strlen(str)+1; i++) { // for every char in str, included the ending NUL byte
if (str[i]!=' ') { // if not blank
buffer[j++] = str[i]; // copy
}
}
return buffer; // return a newly constructed C-string
}
int main(void){
char str[] = "This has spaces in it.";
char *new = deblank(str);
puts(new);
free(new); // release the allocated memory
}
1
Jean-Baptiste Yunès
25 Июл 2017 в 16:13
Вы можете попробовать рекурсивно
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void deblank(const char* str, char *dest) {
if (!*str) {*dest = '';return;}
// when we encounter a space we skip
if (*str == ' ') {
deblank(str+1, dest);
return;
}
*dest = *str;
deblank(str+1, dest+1);
}
int main(void) {
const char *str = "This has spaces in it.";
char *output = malloc(strlen(str)+1);
deblank(str, output);
puts(output);
free(output);
}
1
n3wb
25 Июл 2017 в 20:06
Там может быть три подхода к задаче.
Первый — обновить строку «на месте». В этом случае функция может выглядеть примерно так
#include <stdio.h>
#include <ctype.h>
#include <iso646.h>
char * deblank( char s[] )
{
size_t i = 0;
while ( s[i] and not isblank( s[i] ) ) ++i;
if ( s[i] )
{
size_t j = i++;
do
{
if ( not isblank( s[i] ) ) s[j++] = s[i];
} while( s[i++] );
}
return s;
}
int main(void)
{
char s[] = "This has spaces in it.";
puts( s );
puts( deblank( s ) );
return 0;
}
Выход программы
This has spaces in it.
Thishasspacesinit.
Другой подход заключается в копировании исходной строки в массиве символов назначения, пропуская пробелы.
В этом случае функция будет иметь два параметра: исходный массив и целевой массив. И размер массива назначения должен быть равен размеру исходного массива, потому что в общем случае исходный массив не может иметь пробелов.
#include <stdio.h>
#include <ctype.h>
#include <iso646.h>
char * deblank( char *s1, const char *s2 )
{
char *t = s1;
do
{
if ( not isblank( *s2 ) ) *t++ = *s2;
} while ( *s2++ );
return s1;
}
int main(void)
{
char s1[] = "This has spaces in it.";
char s2[sizeof( s1 )];
puts( s1 );
puts( deblank( s2, s1 ) );
return 0;
}
Вывод программы будет таким же, как показано выше.
Обратите внимание на эту декларацию
char s2[sizeof( s1 )];
Размер строки назначения в целом должен быть не меньше, чем размер исходной строки.
И, наконец, третий подход — когда внутри функции динамически создается массив, и из функции возвращается указатель на первый элемент массива.
В этом случае желательно сначала подсчитать количество пробелов в исходном массиве, чтобы выделить массив назначения с соответствующим размером.
Чтобы использовать функции malloc и free, вам необходимо включить следующий заголовок
#include <stdlib.h>
Функция может быть реализована так, как показано в демонстрационной программе.
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <iso646.h>
char * deblank( const char *s )
{
size_t n = 1; /* one byte reserved for the terminating zero character */
for ( const char *t = s; *t; ++t )
{
if ( not isblank( *t ) ) ++n;
}
char *s2 = malloc( n );
if ( s2 != NULL )
{
char *t = s2;
do
{
if ( not isblank( *s ) ) *t++ = *s;
} while ( *s++ );
}
return s2;
}
int main(void)
{
char s1[] = "This has spaces in it.";
char *s2 = deblank( s1 );
puts( s1 );
if ( s2 ) puts( s2 );
free( s2 );
return 0;
}
Вывод программы такой же, как и для двух предыдущих программ.
Что касается стандартной функции C strcat, то она содержит две строки.
Например
#include <stdio.h>
#include <string.h>
int main(void)
{
char s1[12] = "Hello ";
char *s2 = "World";
puts( strcat( s1, s2 ) );
return 0;
}
Массив назначения (в данном случае s1) должен иметь достаточно места для добавления строки.
В Стандарте C есть еще одна функция C strncat, которая позволяет добавлять в строку один символ. Например, вышеприведенную программу можно переписать следующим образом
#include <stdio.h>
#include <string.h>
int main(void)
{
char s1[12] = "Hello ";
char *s2 = "World";
for ( size_t i = 0; s2[i] != ''; i++ )
{
strncat( s1, &s2[i], 1 );
}
puts( s1 );
return 0;
}
Но неэффективно использовать такой подход для вашей исходной задачи, потому что каждый раз, когда вызывается функция, она должна найти конечный ноль в исходной строке, чтобы добавить символ.
1
Vlad from Moscow
25 Июл 2017 в 17:00
Я попытался скомпилировать с включенными предупреждениями, вот некоторые, которые вы должны исправить.
- Вы должны включить
stdlib.h char *new[strlen(str)]создает массивchar*, а неchar, поэтому на самом деле это не строка. Измените его наchar new[strlen(str)].- Чтобы проверить, является ли
str[i]пробелом, вы сравниваете его с пробелом' ', а не с строкой, единственным символом которой является пробел" ". Так что измените его наstr[i]!=' ' strcatпринимает строку в качестве второго аргумента, а не символ, как вы передаете ее с помощьюstr[i].
Кроме того, для чего вы используете buffer?
Другая ошибка заключается в том, что вы, вероятно, предполагали, что неинициализированные массивы принимают нулевые значения. Массив new имеет случайные значения, а не ноль / ноль. strcat объединяет две строки, поэтому он попытается поместить строку в свой второй аргумент в конце первого аргумента new. «Конец» строки является нулевым символом. Программа ищет new первого нулевого символа, который может найти, и когда она находит этот нулевой символ, она начинает записывать второй аргумент оттуда.
Но поскольку new неинициализирован, программа может не найти нулевой символ в new и будет продолжать поиск дальше, чем длина new, strlen(str), продолжая поиск в нераспределенной памяти. Это, вероятно, то, что вызывает ошибку сегментации.
1
devil0150
25 Июл 2017 в 16:06
ОК, давай сделаем это.
#include <stdio.h>
#include <string.h>
char * deblank(const char str[]){
char *new[strlen(str)];
^ Эта строка создает массив указателей, а не строку.
char *buffer = malloc(strlen(new)+1);
malloc не объявлен. Отсутствует #include <stdlib.h>. Кроме того, вы должны проверить наличие ошибки распределения здесь.
strlen(new) — ошибка типа. strlen занимает char *, но new является (или, скорее, оценивает) как char **.
for (int i=0; i<strlen(*str); i++){
strlen(*str) — ошибка типа. strlen занимает char *, но *str является char (то есть одним символом).
i<strlen(...) сомнителен. strlen возвращает size_t (тип без знака), тогда как i является int (со знаком и, возможно, слишком маленьким).
Вызов strlen в цикле неэффективен, потому что он должен пройти всю строку, чтобы найти конец.
if(buffer!=NULL){
Это странное место для проверки на отсутствие выделения. Кроме того, вы нигде не используете buffer, так зачем вообще его создавать / проверять?
if(str[i]!=" "){
str[i]!=" " — ошибка типа. str[i] является char, тогда как " " является (или, скорее, оценивает) как char *.
strcat(new,str[i]); //Segmentation fault
Это ошибка типа. strcat занимает две строки (char *), но new является char **, а str[i] является char. Кроме того, первый аргумент strcat должен быть допустимой строкой, но new неинициализирован.
}
}
}
free(buffer);
return new;
new является локальным массивом в этой функции. Вы возвращаете адрес его первого элемента, что не имеет смысла: как только функция вернется, все ее локальные переменные исчезнут. Вы возвращаете неверный указатель здесь.
Кроме того, это ошибка типа: объявлено, что deblank возвращает char *, но фактически возвращает char **.
}
int main(void){
char str[] = "This has spaces in it.";
char new[strlen(str)];
*new = deblank(str);
Это ошибка типа: *new является char, но deblank возвращает char *.
puts(new);
puts принимает строку, но new по сути является мусором на этом этапе.
}
2
melpomene
25 Июл 2017 в 16:08
Итак, не уверен, поможет ли это вам, но код C, выполняющий то же самое, что и код Java, будет выглядеть так:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char *removeBlanks(const char *str)
{
char *result = malloc(strlen(str) + 1);
if (!result) exit(1);
const char *r = str;
char *w = result;
while (*r)
{
// copy each character except when it's a blank
if (*r != ' ') *w++ = *r;
++r;
}
*w = 0; // terminate the result to be a string (0 byte)
return result;
}
int main(void)
{
const char *str = "This has spaces in it.";
char *new = removeBlanks(str);
puts(new);
free(new);
return 0;
}
Я бы не рекомендовал называть переменную new … если вы когда-нибудь захотите использовать C ++, это зарезервированное ключевое слово.
2
user2371524user2371524
25 Июл 2017 в 16:04
|
RoverWWWorm 0 / 0 / 0 Регистрация: 17.10.2010 Сообщений: 35 |
||||
|
1 |
||||
|
21.06.2011, 11:00. Показов 3939. Ответов 10 Метки нет (Все метки)
не могу понять в чем ошибка, помогите разобраться в коде
__________________
0 |
|
4864 / 3286 / 468 Регистрация: 10.12.2008 Сообщений: 10,570 |
|
|
21.06.2011, 11:07 |
2 |
|
1) s перескакивает за нуль-символ, а надо на нём остановиться
0 |
|
diagon Higher 1953 / 1219 / 120 Регистрация: 02.05.2010 Сообщений: 2,925 Записей в блоге: 2 |
||||||||||||
|
21.06.2011, 11:10 |
3 |
|||||||||||
|
РешениеВо-первых
Не стоит так делать
Во-вторых strcat не так работает, он возвращает указатель.
На последней итерации, когда встречается конец строки, указатель инкрементируется, и указывает на следующий за нулем элемент. Т.е. фактически строки склеиваются, но их разделяет этот нуль-символ, поэтому вторая строка не выводится
0 |
|
0 / 0 / 0 Регистрация: 17.10.2010 Сообщений: 35 |
|
|
21.06.2011, 11:12 [ТС] |
4 |
|
но мне надо именно с указателями, если не сложно можете написать свой код только с указателями
0 |
|
Higher 1953 / 1219 / 120 Регистрация: 02.05.2010 Сообщений: 2,925 Записей в блоге: 2 |
|
|
21.06.2011, 11:13 |
5 |
|
но мне надо именно с указателями, если не сложно можете написать свой код только с указателями Это неправильно и невозможно.
0 |
|
0 / 0 / 0 Регистрация: 17.10.2010 Сообщений: 35 |
|
|
21.06.2011, 11:19 [ТС] |
6 |
|
Это неправильно и невозможно. в учебнике брайан кернигана и денниса ритчи есть задание: напишите свою версию функции strcat, с применением указателей, вот я и решил сделать с укателями, помогите довести дело до конца
0 |
|
Higher 1953 / 1219 / 120 Регистрация: 02.05.2010 Сообщений: 2,925 Записей в блоге: 2 |
|
|
21.06.2011, 11:20 |
7 |
|
Ну так и делайте с указателями(функция у вас почти правильная), но объявляйте массивы, а не указатели на константы.
0 |
|
accept 4864 / 3286 / 468 Регистрация: 10.12.2008 Сообщений: 10,570 |
||||||||||||||||
|
21.06.2011, 11:26 |
8 |
|||||||||||||||
4) *line — это один символ, а надо передать адрес первого символа строки
напишите свою версию функции strcat, с применением указателей имеется в виду, что функция должна работать с передаваемыми строками через указатели, а не как с массивами
5) 1 — это значение сбоя достаточно заменить
0 |
|
RoverWWWorm 0 / 0 / 0 Регистрация: 17.10.2010 Сообщений: 35 |
||||
|
21.06.2011, 11:36 [ТС] |
9 |
|||
|
ура, работает, спасибо!
0 |
|
schdub
3064 / 1404 / 423 Регистрация: 19.01.2009 Сообщений: 3,828 |
||||
|
21.06.2011, 12:48 |
10 |
|||
|
Исходник функции strcat из MSVCRT:
а, чуть не забыл: Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
1 |
|
xAtom 934 / 759 / 299 Регистрация: 09.12.2010 Сообщений: 1,346 Записей в блоге: 1 |
||||
|
21.06.2011, 23:30 |
11 |
|||
|
РешениеВот моя реализация strcat на встроенном ASM.
0 |
C не имеет стандартного типа, называемого string, и вы не показали нам, как вы это определили.
Тем не менее, мы можем предположить, что это похоже на:
char *myNewKey = "";
if (keylength < length)
{
int myValue = ((length - keylength) / keylength) + 1;
for (int i = 0; i < myValue; i++)
myNewKey = strcat(key, myNewKey);
}
printf("%s", myNewKey);
Даже не видя декларации key, мы можем видеть приближающиеся проблемы. Предположим, что у вас есть:
char key[100] = "a";
Если вы повторяете цикл достаточно часто (опять же, у нас недостаточно информации, чтобы быть уверенными, что вы делаете, пожалуйста, освежите в памяти, что представляет собой Короткий, автономный, правильный (компилируемый) пример), то буфер рано или поздно переполнится, а это приведет к проблемам и май вызвать ошибку сегментации.
If key Также string как моя гипотеза myNewKey, то у вас есть всевозможные проблемы с распределением пространства, плюс вы можете писать в постоянную память (хороший способ получить ошибку сегментации и дамп ядра).
Для других определений string, key и myNewKey (не считая length и keylength), есть и другие способы столкнуться с проблемами.
Вероятно, вам следует добавить новую строку в конец строки формата ("%sn") В printf() утверждение. Без него вы не гарантируете, что увидите вывод своевременно (даже с ним вы можете не увидеть вывод своевременно, но программа, работающая в окне терминала, обычно выводит каждую строку как символ новой строки, заканчивающийся на ней). написано).
Проблема в том, что функция strcat не выделяет память, а копирует из одной строки в другую. Поскольку длина первой строки меньше, чем длина второй, то память перетирается. Нужно изменить код, например, так.
#include <stdio.h>
#include <string.h>
int main() {
char first[7] = "first";
char second[7] = "second";
char *third = strcat(first, second);
}
→ Ссылка
Автор решения: zed
Чтобы склеить 2 строки в Си, нужно выполнить следующие действия:
-
При помощи функции
mallocвыделить блок памяти (result), достаточный для сохранения в него обеих строк (и не забыть про место, для завершающего нуля) -
При помощи функции
memcpyскопировать первую строкуs1в начало выделенного блока -
При помощи всё той же функции
memcpyскопировать вторую строкуs2, вместе с её нулём, в выделенный блок, со смещением на размер первой строки -
После того, как вы совершили какие-то манипуляции с полученной строкой, её нужно освободить, при помощи функции
free
Пример:
char* concat(char *s1, char *s2) {
size_t len1 = strlen(s1);
size_t len2 = strlen(s2);
char *result = malloc(len1 + len2 + 1);
if (!result) {
fprintf(stderr, "malloc() failed: insufficient memory!n");
return NULL;
}
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1);
return result;
}
Как использовать:
char *s = concat("first", "second");
printf("%sn", s);
free(s);
→ Ссылка
Автор решения: αλεχολυτ
Для strcat первый аргумент должен указывать на буфер достаточной длины, чтобы в него могла поместиться итоговая (склеенная) строка. Переменные first и second являются указателями на строковые литералы, т.е. данные по таким указателям изменять нельзя. Это приводит к неопределенному поведению (UB).
Исходный пример может быть переписан следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
const char* first = "first"; // const явно указывает, что такие данные менять нельзя
const char* second = "second";
char* buff = calloc(strlen(first) + strlen(second) + 1, 1);
strcat(buff, first);
strcat(buff, second);
printf("%sn", buff);
free(buff);
}
Результат выполнения
→ Ссылка
Автор решения: insolor
Самый простой вариант — явно зарезервировать под первую строку (к которой будет «приклеиваться» вторая строка) памяти с запасом:
#include <stdio.h>
#include <string.h>
int main() {
char first[256] = "first";
char second[] = "second";
strcat(first, second);
puts(first);
return 0;
}
Результат выполнения: http://ideone.com/OOXUCV
→ Ссылка
Автор решения: AnT
Если содержимое строк известно на этапе компиляции, то и склеивание можно организовать на этапе компиляции
#define FIRST "first"
#define SECOND "second"
int main(void)
{
const char *first = FIRST;
const char *second = SECOND;
const char *third = FIRST SECOND;
}
Но это уж зависит от того, что именно вам нужно.
Для склеивания во время выполнения использовать функцию strcat — не самая лучшая идея из-за того, что при каждом склеивании функция снова и снова выполняет сканирование уже построенной части строки. (По этой причине strcat — фактически бесполезная функция.) Лучше уж воспользоваться для этих целей обычным snprintf
#include <stdio.h>
int main(void)
{
const char *first = "first";
const char *second = "second";
char third[512];
snprintf(third, sizeof third, "%s%s", first, second);
}
А уж какой способ резервирования памяти для строки-получателя вам больше подходит — зависит от ваших конкретных обстоятельств и требований.
→ Ссылка
Автор решения: avp
Раз уж пошло такое массовое отвечание некропоста, то внесу и свою лепту.
В GNU есть очень удобный аналог sprintf — asprintf, которая размещает результат «вывода» своих аргументов в динамической памяти (использует malloc).
Соответственно, программа может быть такой:
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int
main (int ac, char *av[])
{
char first[] = "first",
second[] = "second";
char *third;
if (asprintf(&third, "%s%s", first, second) < 0)
third = strdup(strerror(errno));
return puts(third) == EOF;
}
А если у вас ее (asprintf) нет, то несложно и самому написать
static int
asprintf (char **ps, const char *fmt, ...)
{
// puts("my asprintf");
va_list ap;
va_start(ap, fmt);
int rc = vsnprintf(*ps, 0, fmt, ap);
va_end(ap);
if (rc >= 0) {
if ((*ps = (char *)malloc(rc + 2))) {
va_start(ap, fmt);
rc = vsnprintf(*ps, rc + 1, fmt, ap);
va_end(ap);
} else
rc = -1;
}
return rc;
}
(или скопипастить) и использовать уже без всяких #define _GNU_SOURCE даже в винде (по крайней мере MinGW успешно транслирует).
→ Ссылка
Автор решения: Daniel Shatz
#include <stdlib.h>
#include <string.h>
char* concat(char *s1, char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 нужен для нуль-терминатора строки.
strcpy(result, s1);
strcat(result, s2);
return result;
}
- Выделяем нужное количество памяти
- Склеиваем и возвращаем указатель на начало блока памяти.
→ Ссылка
Автор решения: MarianD
Потому что функция strcat() добавляет
- строку, на которую указывает второй параметр (
"second") -
к строке, на которую указывает первый параметр (
"first") -
и затем вращает первый параметр — указатель на первую строку, но к которой теперь добавлена и вторая строка,
нужно для первого параметра выделить достаточную память для соединенной строки ("firstsecond") — или во время компиляции, или динамически.
→ Ссылка
Формулировка задачи:
Сделал программу, в с новичок, но при вызове strcat выдоет ошибку: «Segmentation fault (core dumped)» Что не так? Заранее спс
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main (void) {
int height;
do {
printf("height: ");
height = GetInt();
} while (!((height > 0) && (height < 23)));
for (int i = 0;i < height;i++){
char *lattice = "##";
printf("%sn", lattice);
strcat(lattice, "#");
}
return 0;
}
Код к задаче: «Segmentation fault (core dumped) в strcat»
textual
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main (void) {
int height;
int i;
char lattice[22] = {'#', '#'};
do {
printf("height: ");
scanf("%d", &height);
} while (!((height > 0) && (height < 23)));
for ( i= 0;i < height;i++){
printf("%sn", lattice);
strcat(lattice, "#");
}
return 0;
}
Полезно ли:
15 голосов , оценка 4.067 из 5
Сообщение было отмечено Памирыч как решение
