字串括號匹配檢測
阿新 • • 發佈:2018-12-02
題目
- 輸入一行字串包含(),如果匹配成功,返回0;否則返回字串,並在未匹配的括號下面做標記(用A表示箭頭指向上面),顯示錯誤資訊。例如:
輸入:
a=1+(4*7))/(8+8)
輸出:
a=1+(4*7))/(8+8)
A
沒有匹配的左括號
程式碼
- 題目分析:
- 定義一個counter,用來計數。進行字串掃描,當掃描到 ( 括號時,counter++;當掃描到 )counter- -。
- 情況:
(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;
}
- 結果: