删除字母之间的制表符和空格 - 分段错误

时间:2015-01-19 05:37:04

标签: c segmentation-fault whitespace removing-whitespace

这是我到目前为止所拥有的:

      while ((currentChar != '\0') && (i < (length - 1)))
      {

          if (isalnum(*currentChar))
          {
              foundAlphaNum = 1;
          }

          if (*currentChar != ' ' && *currentChar != '\t' && *currentChar !='\n' && foundAlphaNum)
          {
              modifiedString[i] = *currentChar;
              i++;
          }
          else if ((*currentChar == ' ' || *currentChar == '\t') && !foundAlphaNum)
          {
              modifiedString[i] = *currentChar;
              i++;
          }
          else if(*currentChar == '\n')
           {
             modifiedString[i] = *currentChar;
             i++;
             foundAlphaNum = 0;
           }

         currentChar++;

     }

     // add null terminating char (maybe...)
     modifiedString[i] = '\0';
     printf("%s\n", modifiedString);

继承我的输出:

 "       HelloLbaldkgabcdefghijklmnopqrstuvwxyz0123456789
 helluhworldzguhmornings

 hhulsuhfhdjfue12345678910morealphabettseee"

它应该在第一个字母出现之前留下任何空白,它在第一行显示,但它在其他行上删除它们。

我已经尝试将其重置为0,但它为我提供了分段故障核心转储

4 个答案:

答案 0 :(得分:1)

当您到达行尾

时,您不会重置foundAlphaNum

你应该再添加一个if语句

else if ( *currentChar == '\n' )
{
  modifiedString[i] = *currentChar;
  foundAlphaNum = false;
}

你可以做这样的事情

char buf[255] = {"  your string bla bla\n  bla bla bla\n  bla bla"};
char* p = buf;
int targetIndex = 0;
char modifiedString[255] = {'\0'};
bool beforeLetter = true;

for (p = buf; *p && targetIndex < sizeof(buf); ++p)
{
  if (*p == '\n')
  {
    beforeLetter = true;
  }
  else if ( isspace(*p) && beforeLetter )
  {
    modifiedString[targetIndex++] = *p; // copy preceding spaces
  }
  else if ( isspace(*p) && !beforeLetter )
  {
    ; // skip spaces after letter is found
  }
  else if ( isalphanum(*p) )
  {
    beforeLetter = false;
    modifiedString[targetIndex++] = *p;
  }
}
 modifiedString[targetIndex++] = '\0';

答案 1 :(得分:0)

检查以下代码:

while(//Assuming you are doing it line by line //)
{
    i=0;
    flag = 0;
    while ((currentChar != '\0') && (i<length-1))
    {
       if (isalnum(*currentChar))
       {
          flag = 1;
          modifiedString[i] = *currentChar;
          i++;
       }
       else if((*currentChar == ' ' || *currentChar == '\t') && !flag)
       {
          modifiedString[i] = *currentChar;
          i++;
       } 
       currentChar ++;
    }
    modifiedString[i] = '\0';
    //print or store the modified string for this line //
}

答案 2 :(得分:0)

要使代码忽略每行的前导空格,您可以在找到换行符时将foundAlphaNum重置为零...但是您应该这样做'\n'的测试实际发生的地方。在修订后的代码中,对'\n'的检查发生在else子句后面,if(后面两个),如果已在行上找到字母数字字符,则执行foundAlphaNum或者更早的,因为此错误会阻止while被重置。

您的currentChar循环条件中也存在错误,您将指针'\0'(而非其指向的角色)与/* == fixed loop condition == */ while ((*currentChar != 0) && (i < (length -1))) { if (isalnum(*currentChar)) { foundAlphaNum = 1; } /* == moved '\n' test (now checked first) == */ if (*currentChar == '\n') { modifiedString[i] = *currentChar; i++; foundAlphaNum = 0; } else if (*currentChar != ' ' && *currentChar != '\t' && foundAlphaNum) { modifiedString[i] = *currentChar; i++; } else if ((*currentChar == ' ' || *currentChar == '\t') && !foundAlphaNum) { modifiedString[i] = *currentChar; i++; } currentChar++; } // add null terminating char (maybe...) modifiedString[i] = '\0'; printf("%s\n", modifiedString); 进行比较,这可能导致你的段错误。

修复这些问题(保留代码主要是这样)可能会给出:

while ((*currentChar != 0) && (i < length - 1))
{
    if (isalnum(*currentChar))
        foundAlphaNum = 1;

    switch (*currentChar) {
      case '\n':
        foundAlphaNum = 0;
      case ' ':
      case '\t':
        if (foundAlphaNum)
            break;
      default:
        modifiedString[i++] = *currentChar;
    }

    currentChar++;
}
modifiedString[i] = '\0';
puts(modifiedString);

然而,仍然有足够的空间来清理东西。例如:

if

在上文中,如果找到字母数字字符,则foundAlphaNum设置switch。然后foundAlphaNum使用案例直通,如果找到换行则清除foundAlphaNum,然后将该字符添加到新字符串,除非它是空格或制表符并且currentChar是组。然后isalnum()递增,添加终止nul,并打印字符串。

另请注意,您的代码(以及上面的替代方法)仅剥离空格和水平制表符,并且仅在行上找到字母数字字符后才会这样做(与任何非空格字符相对) ,像标点符号)。如果这不是您想要的,您可能希望将*currentChar替换为{{1}}不是空格或制表符。

答案 3 :(得分:-1)

i=0;
flag = 0;
while ((currentChar != '\0') && (i<length-1))
{
   if (isalnum(*currentChar))
   {
      flag = 1;
      modifiedString[i] = *currentChar;
      i++;
   }
   else if((*currentChar == ' ' || *currentChar == '\t') && !flag)
   {
      modifiedString[i] = *currentChar;
      i++;
   }
   else if(*currentChar == '\n')
   {
       flag = 0 ;
   } 
   currentChar ++;
}
modifiedString[i] = '\0';
//print or store the modified string for this line //

我认为这样可行......试试这个..