C言語:コメントを削除する

質問をした後に得られた洞察に基づいて、これと共有してください:

トピック:
キーボードから1行の文字を読み取り(慣例:127バイト以下の文字数)、コメントが合法かどうかを判断します。違法の場合はエラーが報告されます。合法の場合は削除してください。出力する前にコメントします。正当なコメントとは、「 /」でマークされたコメント開始と「 /」でマークされたコメントの終了を指し、通常は/ *……* /で表されます。

この共有は2つのステップに分かれています。

  1. コード表示
  2. コードシェア

1.コード表示:

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

int findfirst(char str[128]);
int findlast(char str[128]);

int main(void)
{
    
    
	int first, last;
	char string[128];
	char result[128];

	printf("input a string:");
	gets(string);

	first = findfirst(string);
	last = findlast(string);

	strcpy(result, string);
	printf("%s  %s",result + first,string + last);
	if (first >= 0 && last >= 0)
	{
    
    
		strcpy(result + first, string + last);
	}


	if (first >= 0 && last >= 0 && last >= first + 4 || first == -1 && last == -1)
	{
    
    
		printf("Output:\nThe result is :\n");
		puts(result);
	}
	else
	{
    
    
		printf("Output:\ncomment is error\n");
	}
	return 0;
}

int findfirst(char str[128])
{
    
    
	int i;

	for (i = 0; str[i] != '\0'; i++)
	{
    
    
		if (str[i] == '/' && str[i + 1] == '*')
		{
    
    
			return i;
		}
	}
	return  (-1);
}

int findlast(char str[128])
{
    
    
	int i;

	for (i = 0; str[i] != '\0'; i++)
	{
    
    
		if (str[i] == '*' && str[i + 1] == '/')
		{
    
    
			return i + 2;
		}
	}
	return (-1);
}

int findfirst(char str[128]);
int findlast(char str[128]);
此处的子函的功能时是为找出'/*''*/',并对其脚标标记返回相应的脚标数值以便于主函数删除。
printf("%s  %s",result + first,string + last);

この段落は、次のコードの機能をより明確に理解できるようにするために、私が特別に追加したものです。

if (first >= 0 && last >= 0)
	{
    
    
		strcpy(result + first, string + last);
	}

このコードの機能は、コメントを削除することです。
次に、なぜ結果+最初、文字列+最後の式を使用するのですか。
strcpyの使用法は、後者を前者にコピーすることです。文字配列名+特定の番号を使用して、文字配列全体のどれから出力を開始するかを指定できます。結果+最初のセクションで文字を指定できます-this文字 '/'次の内容から始めます。

図に
ここに画像の説明を挿入します
示すように、画像とテキストの方が理解しやすくなっています。画像の2番目の段落は、次のステートメントの実現です
。printf( "%s%s"、result + first、string + last);
削除方法それ?
結果+最初に「/」から始まる出力に依存して次のstrcpyを出力し、文字列の後半部分+最後に「i」から始まる出力をコピーして削除を実行します。

おすすめ

転載: blog.csdn.net/yooppa/article/details/114600681