4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
1

Падает программа с strcpy

18.05.2015, 14:42. Показов 973. Ответов 10
Метки нет (Все метки)

Не могу понять, почему вылетает программа. Через malloc память для *p выделять пробовал, все равно не получается.
А еще компилятор(компилил через gcc на линуксе) предупреждал, что в printf второй аргумент(то есть *p) имеет тип int. Что за бред?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
main()
{
    char line[10];
    char *p; 
 
    scanf("%s", line);
 
    strcpy(p, line);
 
    printf("%s", *p);
}
Спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2015, 14:42
Ответы с готовыми решениями:

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

Программа падает
Учебный пример из книги Руководство пользователя &quot;С без проблем&quot; Клинт Хикс 1997 год. Страница...

Программа падает
/**************************************************************************** * ...

программа с использованием strcpy
&quot;задан текст. удалить из текста все слова, длина которых четная&quot; т.е. скопировать в новый массив те...

10
Native x86
Эксперт Hardware
4903 / 2798 / 821
Регистрация: 13.02.2013
Сообщений: 9,033
18.05.2015, 14:53 2
Цитата Сообщение от wondermilk Посмотреть сообщение
Через malloc память для *p выделять пробовал, все равно не получается.
Как пробовали? Показывайте код.

Цитата Сообщение от wondermilk Посмотреть сообщение
предупреждал, что в printf второй аргумент(то есть *p) имеет тип int. Что за бред?
Почему бред? char -- это 8-битное целое число, а не то, что вы подумали. Разыменовывая указатель, вы получили именно его.
0
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
18.05.2015, 15:02  [ТС] 3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
main()
{
    char line[10];
    char *p = (char*)malloc(sizeof(char) * 10); 
 
    scanf("%s", line);
 
    strcpy(p, line);
 
    printf("%s", *p);
 
    free(p);
}
Ведь так?
0
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 2
18.05.2015, 16:10 4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<fcntl.h>
#include<string.h>
 
int main(){
    char str[10];
    char *p = malloc(sizeof(char)*10);
    int tty;
    tty=open("/dev/tty",O_RDWR);
    if(tty!=-1){
        read(tty,str,10);
        strcpy(p,str);
        write(tty,p,10);
    }
    free(p);
    close(tty);
    return 0;
}
0
46 / 35 / 24
Регистрация: 16.03.2015
Сообщений: 179
18.05.2015, 16:53 5
Иногда, проще посмотреть, чем объяснять...
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
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
 
int main(int argc, char* argv[])
{
    char* p;
    if( (p=(char*)malloc(10))==NULL )
    {   /* Не хватает памяти для размещения буфера. */
        printf("Not enough memory to allocate buffer\n");
        goto H3ll;  /* Завершить программу. */
    }
    
    printf("Please enter a string: ");/* Сообщение пользователю: "Пжлст, введите текст" */
    scanf("%s", p);
    fflush(stdin);
 
    printf("You string: %s \n", p);
 
H3ll:
    system("pause");
 
    return 0;
}
0
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
19.05.2015, 06:41  [ТС] 6
Но ведь должно работать так, как я писал.
Я так говорю потому, что увидел это в функции из книги Кернингена и Ритчи.
Вот дословно функция:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN]; nlines = 0;
 
    while ((len = getline(line, MAXLEN)) > 0)
        if (nlines >= maxlines I !(p = alloc(len)) == NULL)
            return -1;
        else {
            line[len-1] = '\0'; /* óáèðàåì ñèìâîë \n */
            strcpy(p, line);
            lineptr[nlines++] = p;
        }
 
    return nlines;
}
Если убрать лишнее, то останется то, что я написал в вопросе.

И пример из книги тоже не компилится
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
19.05.2015, 07:49 7
Цитата Сообщение от wondermilk Посмотреть сообщение
И пример из книги тоже не компилиРУЕтся
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
62
63
64
65
66
67
68
69
70
#include <stdio.h>
 
#define MAX_CNT         (25)
#define MAX_LEN         (255)
 
int readlines(char** lineptr,int maxlines)
{
   char*    p = NULL;
 
   int      nlines = 0;
 
   char     pszLine[MAX_LEN + 1];
    
   FILE*    pIn = fopen("text.txt","rt");
 
   if (!pIn)
   {
      // Error !
      return -1;
   }
 
   while ((fgets(pszLine,MAX_LEN,pIn)))
   {
      int   iLen = strlen(pszLine);
 
      if ((nlines >= maxlines) || !(p = (char*)malloc(iLen)))
      {
         return -1;
      }
      else
      {
         pszLine[iLen - 1] = 0;   // Ensure ASCIIZ
 
         strcpy(p,pszLine);
         
         lineptr[nlines++] = p;
      }
   }
 
   fclose(pIn);
   pIn = NULL;
 
   return nlines;
}
 
int main(int argc,char** argv)
{
   char*   pText[MAX_CNT];
 
   int   iCnt = readlines(pText,MAX_CNT);
 
   if (iCnt <= 0)
   {
      // Error !
      return 0;
   }
 
   for (int ii = 0; ii < iCnt; ++ii)
   {
      if (pText[ii])
      {
         printf("%s\n",pText[ii]);
 
         free(pText[ii]);
         pText[ii] = NULL;
      }
   }
 
   return 0;
}
Миниатюры
Падает программа с strcpy  
0
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
19.05.2015, 08:39  [ТС] 8
Спасибо, но расскажите, что у меня(и в книге) не так. Все умалчивают и скидывают свой вариант кода

Добавлено через 3 минуты
А то я ничего не вкуриваю и начинаю думать, что я идиот
0
201 / 199 / 65
Регистрация: 06.10.2013
Сообщений: 552
19.05.2015, 08:57 9
Для передачи в printf p не надо разыменовывать:

C
1
2
printf("%s", *p); //неправильно
printf("%s", p); //правильно
Добавлено через 1 минуту
Комментарий относится ко 2й версии вашего кода.
Пояснения почему так - в первом посте quwy
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
19.05.2015, 09:19 10
Цитата Сообщение от wondermilk Посмотреть сообщение
что у меня(и в книге) не так
В двух словах не скажешь...

K&R - это, безусловно один из лучших источников для понимания C, но с известными оговорками.

За 25+ лет (со времени второго издания, первое сейчас неактуально) очень многое поменялось - и в стандартах, и в компиляторах. Начинающему может быть сложно разобраться с правками, необходимыми для компиляции примеров (с другой стороны - поиск и исправление ошибок - верный путь к совершенству).

C (и, особенно, в его K&R варианте) либерально к коэрсии типов, а предагаемый K&R стиль написания кода, IMHO, отвратителен и мало пригоден как для понимания, так и для отладки.

В вашем коде я сделал несколько изменений, чтобы он, во-первых, скомпилировался C++ компилятором, который строже относится к преобразованиям типов, во-вторых, читал из текст из файла и, в-третьих, не использовал неизвестную моему компилятору getline(). До кучи, поправил типографские ошибки и форматирование. Названий переменных старался не менять, чтобы вам было проще "привязаться" к оригинальному коду.

Резюмирая, K&R превосходен для изучения, но с компиляцией примеров из книги у вас могут быть проблемы.
1
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
19.05.2015, 09:36  [ТС] 11
ВОТ! Низкий поклон всем! Теперь все, вообщем то, в голове уложилось
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2015, 09:36

программа падает
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; class area{ public: virtual bool...

Падает программа
ошибки нет. предупреждения такого вида: warning C4996: 'strcat': This function or variable may be...

Программа падает
Запускаю программу, передаю в слоте данные void MainWindow::Calculation() { ...

падает программа
привожу кусок функции из класса сцены int c=0; for (int i=0;i&lt;10;i++) { for (int...


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

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

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