C指针算术数组删除字符

时间:2016-06-30 16:49:18

标签: c arrays loops pointers char

我正在撰写一个收集用户评论的程序。特别是在/**/之外输入的内容。我编写了循环来查找数组中的char "/",我不确定如何删除它以及它之间的所有内容,直到它再次出现。例如,如果我的输入为"comment /* this is my comment */",我需要删除/* */和之间的内容。所以我的输出只是"comment"。如果没有"/* and */"则不删除任何内容。我知道我需要一个循环但是如何编写一个循环来删除数组中的字符,直到下一个"/"出现并删除它? 我的代码如下:

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

void remove_comment(char *s1, char *s2){

  for(; *s1 != '\0'; s1++){  //loops through array until null value
    if(*s1 == '/'){  //if array has '/' stored
                     //clear array elements till next '/' and removes it as well
  }
    else{
    return; //do nothing to array
  }
  strcpy(s2,s1); //copies new modified string to s2 for later use
}

int main(){

  char s1[101]; //declares arrays up to 100 in length with room for null character
  char s2[101];

  printf("Enter a comment: "); //enter a comment
  fgets(s1, 100, stdin);  // saves comment to array

  remove_comment(s1,s2);  //calls function

  printf("%s", s2); //prints my modified array 

  return 0;
}

2 个答案:

答案 0 :(得分:1)

  

我知道我需要一个循环

可以使用循环,也可以使用标准库函数。将char *strstr(const char *s1, const char *s2);视为解决方案的候选部分。

  

strstr函数定位指向字符串的s1指向的字符串中的第一个匹配项(不包括终止空字符)   s2

     

strstr函数返回指向所定位字符串的指针,如果找不到该字符串则返回空指针。

一些未经测试的代码可以给你一个想法。

void remove_comment(const char *src, char *dest){
  char *start = strstr(str, "/*");        // Look for beginning
  if (start) {                            // Find the beginning?
    char *end = strstr(start + 2, "*/");  // Now search 2 past
    if (end) {                            // Find the end?
      memcpy(dest, src, start - src);
      strcpy(&dest[start - src], end+2);
      return;
    }
  }
  strcpy(dest, src);
}

如果你想避免库函数,我会传递一个提示

// if(*s1 == '/'){ 
if(s1[0] == '/' && s1[1] == '*') { 

当然,这不足以在C代码中找到/* */条评论,如:

puts("/* this is not a C comment, but a string literal */");
int a = '/*', b = '*/'; 
// start of comment /* xyz */

答案 1 :(得分:1)

您的代码似乎建立在探索字符串字符的循环上。因此,我建议您采用以下解决方案:

void remove_comment(char *s1, char *s2) 
{
    for(int in_comment=0; *s1 ; s1++){  //loops through array until null value
      if(!in_comment && *s1 == '/' && s1[1]=='*') {  //if array has '/' follewed by '*' stored
          in_comment=1;    // we enter a comment area
          s1++; 
      }
      else if (in_comment) {     // if we are in a comment area
          if (*s1=='*' && s1[1]=='/') {    // we only look for end of comment
              in_comment = 0; 
              s1++;
          }
      }
      else *s2++=*s1;       // if we're not in comment, in all other cases we just copy current char
    }
    *s2='\0'; // don't forget to end the string. 
}

它使用in_comment变量来判断我们当前是否正在评论评论中的字符(以及寻找评论的结尾)(并最终查看评论的开始)。

它使用*s1s1[1]来访问当前和下一个字符。

它保持原始字符串不变。

Online demo