1. 程式人生 > >字串括號匹配檢測

字串括號匹配檢測

題目

  • 輸入一行字串包含(),如果匹配成功,返回0;否則返回字串,並在未匹配的括號下面做標記(用A表示箭頭指向上面),顯示錯誤資訊。例如:

輸入:
a=1+(4*7))/(8+8)

輸出:
a=1+(4*7))/(8+8)
         A
沒有匹配的左括號



程式碼

  • 題目分析:
  1. 定義一個counter,用來計數。進行字串掃描,當掃描到 ( 括號時,counter++;當掃描到 )counter- -。
  2. 情況:
    (1):在掃描到),發現counter==0,意味著前面沒有單獨的( ,則)沒有匹配的(。掃描的時候就知道
    (2):在最後掃描完成之後,counter>0,( 則沒有匹配的)。掃描完,統計字串的時候才知道。
    (3):掃描完成,counter==0,括號完全匹配。

程式碼:

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

char str_i[64];

void MatchParenthsis(const char* str)
{
	int counter=0;  
	int record[10]={0}; //用來存放 ( 的位置
	int flag=0;   //最終不管是( 還是 ) 的位置

	strcpy(str_i,str);    

	for(int i=0; i<strlen(str); i++)
	{
		if(str[
i] == '(') { record[counter++]=i; //檢測到( ,先將位置儲存, counter++對( 進行計數 } if(str[i] == ')') { if(counter==0) //證明前面沒有( 儲存,那麼這是一個 無法匹配的)。儲存位置,退出 { flag=i; break; } else //前面有( , 則匹配,將前面( 的數量減一 { counter--; } } } if(counter != 0) //掃描完成,counter!=0 意味著有 ( 沒匹配,可能有多個,
{ flag=record[counter-1]; //將最後一個沒匹配的( 的位置 交給 flag } //編輯提示資訊 char str_tmp[64]={0}; for(int i=0; i<=flag; i++) { if(i==0) str_tmp[0] ='\n'; else str_tmp[i]=32; } str_tmp[flag+1]=65; str_tmp[flag+2]='\0'; //完成" A" 的字串 if(counter == 0) strcat(str_tmp,"\nthe right ) has no match left (\n"); else strcat(str_tmp,"\nthe left ( has no match right )"); //在後面新增提示資訊 strcat(str_i,str_tmp); //總的合併 } int main(void) { char str[64]; gets(str); MatchParenthsis(str); puts(str_i); return 0; }

  • 結果:
    在這裡插入圖片描述