3

我有一个delete关于结构数组的函数books。我正在向它传递一组记录,author of bookandname of booksize of the list.

现在在这里list[0].author并且所有list[5].authorauthor等于“Dan Brown”(相同的字符串)

void delete(struct books *list,char author[],char name[],int n)
{
    int i,a;
    a=strcmp(list[0].author,list[5].author);
    printf("%d\n",a);              // prints 0
    a=strcmp(list[0].author,author);
    printf("%d\n",a);              // prints other than 0
}    

为什么会这样?这里有什么问题?

4

3 回答 3

2

从以下文档fgets

当发现换行符、文件结尾或错误时,读取停止。保留换行符(如果有)。

这意味着fgets不会'\n'读取字符串的末尾删除final 。因此,您的字符串是:

  1. “丹布朗”
  2. “丹布朗”
  3. "丹布朗\n"

他们不平等

这是使用时非常常见的问题fgets。这就是为什么我通常更喜欢scanf,像这样:

char buffer[BUF_LEN];
char format[16];
int scanf_result;

sprintf(format, "%%%u[^\n]", BUF_LEN);
//....
do
{
  //TODO: Ask for input
  scanf_result = scanf(format, buffer);
  switch (scanf_result)
  {
    case -1: //TODO: Print error message and exit
    case 0: //TODO: Print error mesage and break
  }
  //Discard remainings of buffered input line
  while (getchar() != '\n') {;}
} while (1); //Ugly, but plain

否则,您可以使用fgets以下内容:

int buf_len;

//TODO: Ask for input
while (fgets(buffer, BUF_LEN, stdin) == NULL)
{
  //TODO: Check and handle error
}
buf_len = strlen(buffer);
//Remove trailing '\n', if present
if (buffer[buf_len - 1] == '\n')
{
  buffer[--buf_len] = '\0';
}

尽管它更容易,但我不喜欢第二种方法,因为strlen会再次扫描字符串以确定其长度。在大多数情况下,这不是性能问题,我避免它是因为我有自己的心理问题。

于 2013-10-26T17:06:10.320 回答
1

您应该验证您的输入。有时需要不止一种方法。在这里,我使用strlen(), 和strstr(),因为如果长度是==,并且存在子字符串,那么字符串相等的。所以,在得出结论之前,尝试这样的事情来验证输入字符串是你想要的:

注意:枚举当然不是必需的,但在这里包含以增加输出示例的清晰度。

enum    {
    SAME,     //0
    NOT_SAME  //1
}

void delete(struct books *list,char author[],char name[],int n)
{
    int i,a, len1, len2;
    A = NOT_SAME;
    len1 = strlen(list[0].author);
    len2 = (list[5].author);
    if(strstr(list[0].author,list[5].author) && (len1==len2)) a = SAME;
    printf("%d\n",a);              


    a = NOT_SAME;
    len1 = strlen(list[0].author);
    len2 = (author);
    if(strstr(list[0].author,author) && (len1==len2)) a = SAME;
    printf("%d\n",a);              

}    
于 2013-10-26T17:20:26.120 回答
0

通过逐个字符打印来检查第二个字符串。

尤其是author字符串。

for(i=0; i < strlen(list[0].author);i++)
{
   if(list[0].author[i]!=author[i])
   {
     printf("this is position is not matching\n",i+1);
     //try to print characters and also print ascii characters.
     break; 
   }

}
//or simply try to use strncpy() 
于 2013-10-26T17:00:05.293 回答