1

コードに問題があります。検索したい文字列を入力すると、プログラムがクラッシュします。

コードを確認しましたが、何が問題だったのか理解できませんでした。

あなたのアドバイスが必要になります。

#include <stdio.h>
#include <string.h>

int findTarget(char *string, char *nameptr[], int num);
int main()
{
int index, index2;
int size;
char *nameptr[100];
char *string[100];

printf("Enter the number of names: ");
scanf("%d",&size);

for(index=0; index<size; index++)
{
    printf("Enter A Name: ");
    scanf("%s", &nameptr[index]);
}

printf("\nEnter a string to search:");
scanf("%s", &string);

index2 = findTarget(string[100], nameptr, size);

if ( index2 == -1 )
{
  printf("\nNo - no such name\n");
}
else
{
  printf("\nYes - matched index location at %d\n", index2);
 }
return 0;

}

 int findTarget(char *string, char *nameptr[], int num)
 {
int i=0;

for ( i = 0 ; i < num ; i++ )
{

    if (strcmp(nameptr[i],string)==0)
    {
        return i;
        break;
    }
}

return -1;

}

4

4 に答える 4

2

にメモリを割り当てたことがない&nameptr[index]ため、でメモリを使用することscanfは未定義の動作です。mallocを呼び出す前に実行してみてくださいscanf。また、を削除する必要があり&ます。

于 2013-02-17T11:54:17.547 に答える
0

の配列がありchar*ますが、scanfこれを実行しても、実際にはバッファが割り当てられていません。

代わりに、最初に次のような方法でバッファ用のメモリを予約する必要があります。

for(i=0; i<100; i++) {

    nameptr[i] = malloc(STRING_BUFFER_SIZE);
}
于 2013-02-17T11:57:15.313 に答える
0

コードの問題は、一般的に「メモリ管理」として説明できます。

  • 個々の文字列にメモリを割り当てません
  • あなたは間違ったもののアドレスをに渡していますscanf
  • を使用するとscanf、バッファオーバーランが可能になります
  • string単一の文字列としてではなく、100個の文字列の配列として宣言しました
  • string[100]検索機能に渡しています

これを修正するには、を使用して個々の文字列を動的に割り当てる必要がありますmalloc。一時バッファを使用してから、を使用してコピーするstrdupか、100文字を事前に割り当てて、それに制限するscanfことができます。

変更が必要なプログラムの一部は次のとおりです。

char *nameptr[100];
char string[100]; // The asterisk is gone

printf("Enter the number of names: ");
scanf("%d",&size);

for(index=0; index<size; index++) {
    char buf[100];
    printf("Enter A Name: ");
    scanf("%99s", buf); // Note the limit of 99
    buf[99] = '\0'; // Just to make sure it's terminated
    nameptr[index] = strdup(buf);
}

printf("\nEnter a string to search:");
scanf("%99s", string); // No ampersand

index2 = findTarget(string, nameptr, size); // string, not string[100]

for (index=0; index<size; index++) {
    free(names[i]);
}

残りは単なる「スタイルのポイント」になります。

  • 検索機能breakにアフターは必要ありませんreturn
  • iループの前とループ内初期化する必要はありません
  • \n行頭に印刷することはお勧めしません。
于 2013-02-17T11:58:37.360 に答える
0

クラッシュの理由は、文字列にメモリを割り当てていないためです。

char nameprt[100];の代わりに使用してください*char nameptr[100];。あなたが宣言したのは、100文字の配列ではなく、文字へのポインタの配列でした。

scanf("%s", nameptr); そして、scanfでは、この理由のように実行する必要があります。scanfは配列へのポインタを期待しています。&したがって、変数がすでにポインターである場合、その理由はありません。

于 2013-02-17T14:09:35.807 に答える