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

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

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

Проблема с написанием проги (линейный список). Язык Си.
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <malloc.h>

int a=0,b=0,ch1=0,n;
 
struct Node
{
int word[40];
 
struct Node *next;                                         //ссылка на след. узел
struct Node **ptr;                                        //указатель (вместо ссылки "&Head")
};
typedef struct Node*PNode;                      //тип данных:указатель на узел
PNode Head=NULL;
struct Node **ptr = &Head;                      //инициирование указателя (вместо ссылки "&Head")
 
PNode CreateNode(int NewWord[])                                            //СОЗДАНИЕ ЭЛ-ТА СПИСКА
{PNode NewNode=(PNode)malloc(sizeof(struct Node));         //указатель на новый узел
strcpy(NewNode->word,NewWord);                      //записать слово(замена NewWord на word)
NewNode->next=NULL;                                                                //следующего узла нет
return NewNode;}                                                                         //рез-т функции-адрес узла
 
void AddFirst(PNode ptr,PNode NewNode)               //ДОБАВЛЕНИЕ УЗЛА В НАЧАЛО СПИСКА
{NewNode->next=Head;
Head=NewNode;}
 
void AddAfter(PNode p,PNode NewNode)             //ДОБАВЛЕНИЕ УЗЛА ПОСЛЕ ЗАДАННОГО
{NewNode->next=p->next;
p->next=NewNode;
ch1++;}                                                                     //счетчик(считает кол-во всех слов в списке 1)
 
void AddLast(PNode ptr,PNode NewNode)           //ДОБАВЛЕНИЕ УЗЛА В КОНЕЦ СПИСКА
{PNode q=Head;
if (Head==NULL)                                                     //если список пуст
{AddFirst(Head,NewNode);                                    //вставляем первый элемент
return;}
while (q->next)                                                        //ищем последний элемент
q=q->next;
AddAfter(q,NewNode);}

int main()
{
 PNode ptr = NULL, p;
 FILE *in,*out1;
int word[40],word2[40];
 
printf("Vvod:\n");
scanf("%d",&word2[0]);                                                //ввод слова на запрос №1(компилятор предупреждал: поэтому ввел [0])
 
in=fopen("input.txt","r");                                         //открытие файла 1
 
 while (1)                                                                //в n хранится значение, к-е вернула ф-я fscanf.Если это число меньше 1(чтение прошло неудачно или закончились данные в файле),то происходит выход из цикла.
 {
n=fscanf(in,"%d",word);                                        //чтение данных из файла 1
if (n<=0)
break;
p=CreateNode(word);                                             //создание нового узла
AddLast(Head,p);                                                    //добавление
}
fclose(in);                                                               //закрытие файла1
 
out1=fopen("output1.txt","w");                               //открытие файла2
                                 //ВЫВОД ДАННЫХ В ФАЙЛ №2(ПО ЗАПРОСУ №1)
p=Head;                                                       //присвоение узлу р "головы"
p=p->next->next;
fprintf(out1,"%d",p->word);
 
fclose(out1);                                                           //закрытие файла2
 
return 0;                                                                                //(компилятор предупреждал: поэтому ввел)
}
Во-первых выдает предупреждение: \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
Листинг программы
PNode CreateNode(int NewWord[])                                            //СОЗДАНИЕ ЭЛ-ТА СПИСКА
{PNode NewNode=(PNode)malloc(sizeof(struct Node));         //указатель на новый узел
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
Похожие ответы