Линейный список и ошибка Warning: passing arg 1 of `strcpy' from incompatible pointer type - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Проблема с написанием проги (линейный список). Язык Си.
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <windows.h>
  4. #include <malloc.h>
  5.  
  6. int a=0,b=0,ch1=0,n;
  7. struct Node
  8. {
  9. int word[40];
  10. struct Node *next; //ссылка на след. узел
  11. struct Node **ptr; //указатель (вместо ссылки "&Head")
  12. };
  13. typedef struct Node*PNode; //тип данных:указатель на узел
  14. PNode Head=NULL;
  15. struct Node **ptr = &Head; //инициирование указателя (вместо ссылки "&Head")
  16. PNode CreateNode(int NewWord[]) //СОЗДАНИЕ ЭЛ-ТА СПИСКА
  17. {PNode NewNode=(PNode)malloc(sizeof(struct Node)); //указатель на новый узел
  18. strcpy(NewNode->word,NewWord); //записать слово(замена NewWord на word)
  19. NewNode->next=NULL; //следующего узла нет
  20. return NewNode;} //рез-т функции-адрес узла
  21. void AddFirst(PNode ptr,PNode NewNode) //ДОБАВЛЕНИЕ УЗЛА В НАЧАЛО СПИСКА
  22. {NewNode->next=Head;
  23. Head=NewNode;}
  24. void AddAfter(PNode p,PNode NewNode) //ДОБАВЛЕНИЕ УЗЛА ПОСЛЕ ЗАДАННОГО
  25. {NewNode->next=p->next;
  26. p->next=NewNode;
  27. ch1++;} //счетчик(считает кол-во всех слов в списке 1)
  28. void AddLast(PNode ptr,PNode NewNode) //ДОБАВЛЕНИЕ УЗЛА В КОНЕЦ СПИСКА
  29. {PNode q=Head;
  30. if (Head==NULL) //если список пуст
  31. {AddFirst(Head,NewNode); //вставляем первый элемент
  32. return;}
  33. while (q->next) //ищем последний элемент
  34. q=q->next;
  35. AddAfter(q,NewNode);}
  36.  
  37. int main()
  38. {
  39. PNode ptr = NULL, p;
  40. FILE *in,*out1;
  41. int word[40],word2[40];
  42. printf("Vvod:\n");
  43. scanf("%d",&word2[0]); //ввод слова на запрос №1(компилятор предупреждал: поэтому ввел [0])
  44. in=fopen("input.txt","r"); //открытие файла 1
  45. while (1) //в n хранится значение, к-е вернула ф-я fscanf.Если это число меньше 1(чтение прошло неудачно или закончились данные в файле),то происходит выход из цикла.
  46. {
  47. n=fscanf(in,"%d",word); //чтение данных из файла 1
  48. if (n<=0)
  49. break;
  50. p=CreateNode(word); //создание нового узла
  51. AddLast(Head,p); //добавление
  52. }
  53. fclose(in); //закрытие файла1
  54. out1=fopen("output1.txt","w"); //открытие файла2
  55. //ВЫВОД ДАННЫХ В ФАЙЛ №2(ПО ЗАПРОСУ №1)
  56. p=Head; //присвоение узлу р "головы"
  57. p=p->next->next;
  58. fprintf(out1,"%d",p->word);
  59. fclose(out1); //закрытие файла2
  60. return 0; //(компилятор предупреждал: поэтому ввел)
  61. }
Во-первых выдает предупреждение: \1\main.c||In function `CreateNode':| \1\main.c|22|warning: passing arg 1 of `strcpy' from incompatible pointer type| \1\main.c|22|warning: passing arg 2 of `strcpy' from incompatible pointer type| ||=== Build finished: 0 errors, 2 warnings ===| Во-вторых: В документе input.txt несколько чисел. А в документ output1.txt прога записывает число 4007552- то есть выдает ошибку. Помогите, пожалуйста, разобраться.

Решение задачи: «Линейный список и ошибка Warning: passing arg 1 of `strcpy' from incompatible pointer type»

textual
Листинг программы
  1. PNode CreateNode(int NewWord[])                                            //СОЗДАНИЕ ЭЛ-ТА СПИСКА
  2. {PNode NewNode=(PNode)malloc(sizeof(struct Node));         //указатель на новый узел
  3. strcpy(NewNode->word,NewWord);                      //записать слово(замена NewWord на word)

Объяснение кода листинга программы

  1. PNode CreateNode(int NewWord[]) - это функция для создания нового узла в линейном списке.
  2. NewNode=(PNode)malloc(sizeof(struct Node)) - выделение памяти под новый узел с помощью функции malloc. Значение sizeof(struct Node) используется для определения размера памяти, который нужно выделить.
  3. strcpy(NewNode->word,NewWord) - копирование слова из массива NewWord в поле word нового узла. Здесь возникает ошибка Warning: passing arg 1 ofstrcpy' from incompatible pointer type. Это предупреждение указывает на то, что функцияstrcpyожидает первый аргумент типаchar , а в данном случае передается указатель наint. Это происходит потому, что в C массивы целочисленных типов автоматически преобразуются в указатели на их первый элемент. Чтобы исправить эту ошибку, необходимо привести массивNewWordк типуchar перед копированием. Например, можно использовать следующий код:char wordPtr = (char )NewWord; strcpy(NewNode->word, wordPtr);`

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы