我正在撰写一个收集用户评论的程序。特别是在/*
和*/
之外输入的内容。我编写了循环来查找数组中的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;
}
答案 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
变量来判断我们当前是否正在评论评论中的字符(以及寻找评论的结尾)(并最终查看评论的开始)。
它使用*s1
和s1[1]
来访问当前和下一个字符。
它保持原始字符串不变。