Я довольно новичок в C. Я пытаюсь создать программу, которая будет принимать имена веб-сайтов и имена пользователей, пока пользователь не введет EOF. По мере ввода данных они сохраняются в связанном списке, а затем список сортируется в алфавитном порядке по мере ввода на основе имени веб-сайта. Я не могу найти способ получить строки «Веб-сайт» из двух узлов и сравнить каждый символ, чтобы определить, куда следует вставить новый узел. Любая помощь будет принята с благодарностью, я пытался найти этот сайт и другие решения. Был ли я слишком амбициозным? Он компилируется, но возвращает эту ошибку после двух записей.
test.c:68:24: runtime error: null pointer passed as argument 1, which is
declared to never be null
/usr/include/string.h:130:14: note: nonnull attribute specified here
Segmentation fault
Это как раз тот момент, когда я получил наименьшее количество ошибок. Я понимаю, что строки t & s не должны быть NULL, но любые изменения, которые я делаю, делают это еще хуже.
Мой код
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
typedef struct node
{
char *website;
char *username;
int sitelen;
int userlen;
struct node *next;
}
node;
int main(void)
{
// memory for numbers
node *list = NULL;
// Prompt for numbers (until EOF)
while (true)
{
// Prompt for number
char *site = get_string("Website: ");
// Check for EOF
if (strcmp(site, "") == 0)
{
break;
}
char *user = get_string("Username: ");
// Check whether website is already in list
bool found = false;
for (node *ptr = list; ptr != NULL; ptr = ptr->next)
{
if (ptr->website == site)
{
found = true;
printf("Website already present");
break;
}
}
// If number not found in list, add to list
if (!found)
{
// Allocate space for number
node *nw = malloc(sizeof(node));
if (!nw)
{
return 1;
}
// Add details to list
nw->website = site;
nw->username = user;
nw->next = NULL;
int m = strlen(site);
if (list)
{ // if list head of list exists
node *pre = NULL; // pre pointer
string t = NULL;
strcpy(t, nw->website); // t is newly entered website in lowercase string
for (node *ptr = list; ptr != NULL; pre = ptr, ptr = ptr->next)
{ // move along linked list
string s = NULL;
strcpy(s, ptr->website); // t is newly entered website in lowercase string
if (ptr != list && !ptr->next)
{ // end of list, place new node
ptr->next = nw;
break;
}
else
{ // compare websites to see if node remains or ptr moves on
for (int y = m + 1, i = 0; i < y;)
{ // if a website starts the same but is shorter it is inserted
if (ptr == list && t[i] < s[i])
{
nw->next = list;
list = nw;
break;
}
else if (t[i] < s[i])
{
nw->next = ptr->next;
pre->next = nw;
break;
}
else if (t[i] == s[i])
{
i++;
}
else
{
break;
}
}
break;
}
}
}
else
{ // first itteration assigns list to nw
list = nw;
}
}
}
node *ptr = list;
while (ptr != NULL)
{
node *next = ptr->next;
free(ptr);
ptr = next;
}
}