Линейный список и ошибка Warning: passing arg 1 of `strcpy' from incompatible pointer type - C (СИ)
Формулировка задачи:
Проблема с написанием проги (линейный список). Язык Си.
Во-первых выдает предупреждение:
\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- то есть выдает ошибку.
Помогите, пожалуйста, разобраться.
#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; //(компилятор предупреждал: поэтому ввел)
}Решение задачи: «Линейный список и ошибка 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)
Объяснение кода листинга программы
PNode CreateNode(int NewWord[])- это функция для создания нового узла в линейном списке.NewNode=(PNode)malloc(sizeof(struct Node))- выделение памяти под новый узел с помощью функцииmalloc. Значениеsizeof(struct Node)используется для определения размера памяти, который нужно выделить.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);`