Линейный список и ошибка 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 of
strcpy' from incompatible pointer type. Это предупреждение указывает на то, что функция
strcpyожидает первый аргумент типа
char, а в данном случае передается указатель на
int. Это происходит потому, что в C массивы целочисленных типов автоматически преобразуются в указатели на их первый элемент. Чтобы исправить эту ошибку, необходимо привести массив
NewWordк типу
charперед копированием. Например, можно использовать следующий код:
char wordPtr = (char )NewWord; strcpy(NewNode->word, wordPtr);`
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д