繁体   English   中英

在输入 fget 时检测到堆栈粉碎

[英]Stack Smashing Detected upon input fgets

目的是输入 string1 和 string2 并从 string1 中删除 string2 中出现的任何字母。 输入第二个字符串后,出现堆栈粉碎检测错误。 函数 rmchr 工作正常。 一旦我们到达 rmstr。

主文件:

#include <stdio.h>
#include "rmstr.h"

int main()
{
  int ch, l;
  char x[3];
  x[0]='y';

  while(x[0]=='y'||x[0]=='Y')
  {
    char string[100]={0}, string1[100]={0}, string2[100]={0}, c[3];

    printf("Enter a String: ");
    fgets(string, 100, stdin);
    if (string[98] == '\n' && string[99] == '\0') { while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); }

    printf("Enter a Char: ");
    fgets(c, 2, stdin);
    while ( (ch = fgetc(stdin)) != EOF && ch != '\n');

    rmchr(string, c[0]);

    printf("Enter a String: ");
    fgets(string1, 100, stdin);
    if (string1[98] == '\n' && string1[99] == '\0') { while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); }


    printf("Enter the second string: ");
    fgets(string2, 100, stdin);
    if (string2[98] == '\n' && string2[99] == '\0') { while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); }

    rmstr(string1, string2);

    printf("Run Again?(y/n):");
    fgets(x, 2, stdin);
    while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
  }

 return 0;
} 

函数.h:

rmchr(char *string, char c)
{ 
  int i=0, j=0, count=0;
  char word[100]={0};

  int s = strlen(string);

  for(i=0; i<=(s-2); i++)
  {
    if(string[i] != c && string[i] != ' ')
    {
      word[count] = string[i];
      count++;
    }    
  }

  printf("Word: ");
  for(i=0; i<=count; i++)
  {
    printf("%c", word[i]); 
  }
  printf("\n"); 
}

rmstr(char *string1, char *string2)
{
   int i=0, j=0, count=0;
   char word[100]={0};

   int s = strlen(string1);
   int l = strlen(string2);

   for(i=0; i<=(s-2); i++)
   {
    for(j=0; j<=(s-2); j++)
    {
      if(string1[i] != string2[j] && string1[i] != ' ')
      {
        word[count] = string1[i];
        count++;
      }

    }

  }
}

样本输出:

Enter a String: Ahhaha
Enter a Char: h
Word: Aaa
Enter a String: Annabcdcbcdbckje
Enter the second string: n
*** stack smashing detected ***: ./q4 terminated
Aborted (core dumped)

rmstr

  for(i=0; i<=(s-2); i++)    {
    for(j=0; j<=(s-2); j++)
    {
      if(string1[i] != string2[j] && string1[i] != ' ')
      {
        word[count] = string1[i];
        count++;
      }

    }

您的count数值始终在此循环循环中递增,并且可以大于最大允许值99word组的最后一个元素)。 例如,如果s为 12,则s - 2 * s - 2count100

此外,乍一看,您似乎忘记在第二个循环中使用l使用s代替。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM