-1

ここに、セグメンテーション違反が発生する関数があります

void searchcity()
{
    struct city *ptr=citylist;
    printf("Which city would you like me to search?: ");
    scanf("%s",searchedcity);
    //  printf("%s",searchedcity);
    while(ptr)
    {
        if(!strcmp(searchedcity,ptr->name))
            printf("name= %s, statecode = %s,population = %s,region = %s,zipcode =     %s\n",ptr->name,ptr->statecode,ptr->population,ptr->region,ptr->zipcode);
        else
            printf("sorry, couldnt find that city");
        ptr=ptr->next;
    }   
}

何がこれを引き起こしているのかわかりません。

4

2 に答える 2

0

そのコード(a)に基づいて、最低限確認する必要があるのは次のとおりです。

  • 入力(b)searchedcityに十分なスペースがあります。
  • リンクされたリストに保持されているすべての文字列citylistが適切に構築されている (null で終わる)。
  • 構造体のこれらすべてのフィールドは、実際には整数 (人口など) ではなく、文字配列 (または同等のポインター) であること。
  • リスト自体が適切に構築されていること (ダングリングまたは無効なポインターがないこと)。

segfault とは関係ありませんが、もう 1 つの問題があります

あなたのコードは、あなたの都市と一致しないリスト内のすべて"sorry, couldnt find that city"のノードを出力します。そのため、 、 、およびがあり、 を探すと、そのメッセージが見つかる前に 2 回出力されます。New YorkMoscowLondonLondon

より良い解決策 (多くのバリエーションの 1 つ) は次のようになります。

struct city *ptr = citylist;
while (ptr != NULL)
  if (strcmp (searchedcity, ptr->name) == 0)
    break;

if (ptr == NULL)
  printf ("Sorry, couldnt find that city.\n");
else
  printf ("%s, state = %s, pop = %s,r egion = %s, zip = %s\n",
    ptr->name, ptr->statecode, ptr->population, ptr->region, ptr->zipcode);

そうすれば、ループは正しいポインタを見つけるか、それを NULL に設定する責任があります。ループの後は、何を印刷するかを決定する適切な時期です。


(a)そのコード自体は、危険なコード以外は問題scanfないように見えますが、示されていない他の多くのものに依存しています。

(b)実際、scanfunbounded%sを使用すると、コードに深刻な穴ができ、簡単にバッファ オーバーフローが発生する可能性があります。詳細と解決方法はこちらをご覧ください。いずれにせよ、次のようなものになるscanf("%s")ため、スペースを含む文字列をスキャンする良い方法ではありません:-)Los AngelesLos

于 2013-04-15T01:28:22.890 に答える
-1

以下のコードは機能します。小さな変更を加えました。あなたが持っていたいくつかの小さな間違いは、ptr->next がブラケットがないために実行されなかったことです。残りはコードに書きました。

ありがとうございます。

#include <stdio.h>
struct city {
    char name[100];
    char  statecode[100];
    char  population[100];
    char region[100];
    char zipcode[100];
    struct city* next;
};

int main() // this is your searchcity function
{
    char searchedcity[100]; // make sure you initialize this. YOu haven't done it in the code you gave us.
        // Assume citylist is in your main function or initialized as a global var
        // I initialized it here for simplicity
    struct city* citylist = (struct city*) malloc(sizeof( struct city));
    strcpy(citylist->statecode,"statecode");
    strcpy(citylist->population,"population");
    strcpy(citylist->region,"region");
    strcpy(citylist->zipcode,"zipcode");
    citylist->next = NULL;
//end of citylist
    struct city *ptr = citylist;
    printf("Which city would you like me to search?: ");
    scanf("%s",searchedcity);
//  printf("%s",searchedcity);
    while(ptr)  {
        printf("while \n");
        if(!strcmp(searchedcity,ptr->name)){
               printf("name= %s, statecode = %s,population = %s,region = %s,zipcode =     %s\n",ptr->name,ptr->statecode,ptr->population,ptr->region,ptr->zipcode);
        }else{
                printf("sorry, couldnt find that city");
                ptr=ptr->next;
        }
    }
    return 0;
}
于 2013-04-15T01:47:58.367 に答える