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*,但是当你对它做 ascanf时,你实际上并没有分配一个缓冲区。

相反,您应该首先通过以下方式为缓冲区保留内存:

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]);
}

其余的只是“风格要点”:

  • 搜索功能中不需要breakafterreturn
  • 您不需要i在循环之前和循环初始化
  • \n不鼓励在行首打印。
于 2013-02-17T11:58:37.360 回答
0

好吧,崩溃的原因是因为您没有为字符串分配内存。

使用char nameprt[100];而不是*char nameptr[100];. 您声明的是一个指向字符的指针数组,而不是一个 100 个字符的数组。

在 scanf 中,您必须这样做scanf("%s", nameptr); 原因在于,scanf 需要一个指向数组的指针。&因此,如果变量已经是指针,则没有理由。

于 2013-02-17T14:09:35.807 回答