0

私のコードに問題があります:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct hashTable{
char *data;
struct hashTable *next;
}HASHTABLE;

HASHTABLE **linkedHashTable[100];
void SaveHashTable1(char *str2,char *str3)          //s retazenim---Linked List
{
int hashResult;
HASHTABLE* linkedHashTableNode=NULL, *new_;

hashResult=StringToInt(str2);

if(linkedHashTable[hashResult]==NULL)
{
    linkedHashTableNode=(HASHTABLE*)malloc(sizeof(HASHTABLE));

    linkedHashTableNode->data=(char*)malloc(strlen(str3)*sizeof(char));
    strcpy(linkedHashTableNode->data,str3);

    linkedHashTableNode->next=NULL;
    linkedHashTable[hashResult]=&linkedHashTableNode;
}
else
{
    linkedHashTableNode=*linkedHashTable[hashResult];
    while(linkedHashTableNode->next!=NULL)
        linkedHashTableNode=linkedHashTableNode->next;

    new_=(HASHTABLE*)malloc(sizeof(HASHTABLE));

    new_->data=(char*)malloc(strlen(str3)*sizeof(char));
    strcpy(new_->data,str3);
    new_->next=NULL;
    linkedHashTableNode->next=new_;
}

 }
 int main(void)
 {
char *str1=NULL, *str2=NULL, *str3=NULL;
int i;


while(1)
{
    scanf("%s ", str1);
    if((strcmp(str1, "save"))==0)       //SAVE
    {
        scanf("%s %[^\n]s", str2, str3);

        SaveHashTable1(str2, str3);
    }
}
}

これはコードの一部ですが、これを実行しようとすると問題が発生します:

linkedHashTableNode->data=(char*)malloc(strlen(str3)*sizeof(char));
strcpy(linkedHashTableNode->data,str3);

いつもscanf()のメモリ領域の近くにメモリ空間を確保しているので、再度コンソールからデータを読み込むと元のデータが書き換えられてしまいます。そして、どこに問題があるのか​​ わかりません。

ご協力いただきありがとうございます。

4

3 に答える 3

1

あなたにはいくつかの問題があるように見えます。

まず第一に、scanf() 関数は使用するのが少し面倒なので、gets() を使用して一度に 1 行ずつ取得し、入力行を解析するようにメインを変更することを検討することをお勧めします。ただし、これはショー ストッパーではありません。

main() では、str1、str2、および str3 にメモリを割り当てる必要があります。それらはあなたの質問の NULL へのポインタです。scanf のマニュアル ページを参照してください。

次の修正版のアプリケーションをご覧になることをお勧めします。まだ scanf() を使用していますが、他にも考慮すべき変更がいくつかあります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct hashTable{
    char  *data;
    struct hashTable *next;
}HASHTABLE;

HASHTABLE *linkedHashTable[100];

// stub version of StringToInt() so that it will compile and I can
// do a couple of simple tests in the debugger.
int StringToInt(char *str2)
{
    return 1;
}

void SaveHashTable1(char *str2,char *str3)          //s retazenim---Linked List
{
    int hashResult;
    HASHTABLE *new_;

    hashResult=StringToInt(str2);

    new_ = (HASHTABLE *)malloc(sizeof(HASHTABLE));
    if(linkedHashTable[hashResult] != NULL)
    {
        // since there is at least one entry in the table, lets traverse the list
        // until we reach the end.  we will then append our new entry onto the end.
        HASHTABLE *linkedHashTableNode;
        HASHTABLE *lastLinkedHashTableNode;

        linkedHashTableNode = linkedHashTable[hashResult];
        while(linkedHashTableNode != NULL) {
            lastLinkedHashTableNode = linkedHashTableNode;
            linkedHashTableNode = linkedHashTableNode->next;
        }
        lastLinkedHashTableNode->next = new_;
    } else {
        linkedHashTable[hashResult] = new_;
    }

    new_->data = (char *)malloc(strlen(str3) + 1);
    strcpy(new_->data, str3);
    new_->next=NULL;
}

int main(void)
{
    char  str1[128], str2[128], str3[128];

    while(1)
    {
        scanf("%s ", str1);
        if((strcmp(str1, "save"))==0)       //SAVE
        {
            scanf("%s %[^\n]s", str2, str3);
            SaveHashTable1(str2, str3);
        }
    }
}
于 2012-11-12T18:43:09.117 に答える
1

呼び出しで十分なメモリを要求していませんmalloc。終端の NULを含めずstrlenに文字列に含まれる文字数を示しますが、とにかく終端の NUL 文字をコピーします。strcpy

于 2012-11-12T17:46:43.230 に答える
0

あなたはそれに気付くはずですstrlen("hello world") == 11が、「hello worldはchar[12]保存する必要があります

strlen(str3)char の数を返しますが、末尾の車str3はカウントしません'\0'strlen3

したがって、strcpy は最後の文字列 caractere をコピーできません。

于 2012-11-12T17:47:12.780 に答える