GSM module Help! Repeating Message / Clear char Array?

So heres the Scenario, im trying to interface my "Form" made from Visual Studio C# to an Arduino Uno which is connected to a TC35 GSM Module. The GSM module should send a notification (in the from of a message to the Arduino) whenever and whatever key i press in the Forms textbox. it will then send a TEXT if it sees the "!" character in the notification which was received by the arduino containing the message itself . I will follow a general format for the message in order to efficiently allocate the 160 chars in a text. Now, the first message sent follows the format and is non repeating, but since the notification will be sent WHEN i press a button, it should always send the SAME exact message everytime which is not the case.
Heres the code:

#include <SoftwareSerial.h> 


SoftwareSerial gsmSerial(2,3); // Intialize use of pins 2 and 3 for TX and RX 
byte check;
char letter[159];
char cle[159]; // for clearing
int x =0;

void setup()
{
Serial.begin(9600);
gsmSerial.begin(9600); //9600 Baud Rate
delay(5000);
}
void loop() {
SendNotify();
}


void SendNotify(){
  if (Serial.available()) {
     check = Serial.read();
             if(check==33){ 
             
              gsmSerial.print("AT+CMGF=1\r"); //SEND SMS
              delay(100);
              gsmSerial.println("AT+CMGS=\"+63xxxxxxxxx\""); //Phone Number
              delay(100);       
              gsmSerial.print(letter);
              delay(100);
              gsmSerial.println((char)26);
              int x =0; 
              gsmSerial.flush();
              
              
              //Serial.print(letter);
              }
              if (x <=159){
              letter [x] = check; 
              x++; 
              }
  }
}

Heres an Example message generated from the code above:
1st message: Hello you are over speeding
2nd message: !Hello you are over speeding !Hello you are over speeding !Hello you are over speeding
same goes for the 3rd message.

I believe its because of not clearing the char array "letter" so i made another char array of the same size "cle" and used strcpy to clear "letter" like so:

 gsmSerial.print("AT+CMGF=1\r"); //SEND SMS
              delay(100);
              gsmSerial.println("AT+CMGS=\"+63xxxxxxxxx\""); //Phone Number
              delay(100);       
              gsmSerial.print(letter);
              delay(100);
              gsmSerial.println((char)26);
              int x =0; 
              strcpy(letter,cle); // added this
              gsmSerial.flush();

The first message is the same (no problems whatsoever) BUT the message received and anything following that is just a V
Yes, it send a letter "V".

Am I correct with my assumption that the repeating message is because of me not clearing the char array?
if NO then what should I change in my codes / what is the cause of the repetition
if YES then what am I doing wrong? am i using strcpy correctly?

             if(check==33){

Why not make this obvious?

             if(check == '!' )
             {
              gsmSerial.print(letter);

letter is NOT a string. A string is a NULL terminated array of chars. While letter is an array of chars, there is not a NULL in sight, so is it NOT a string. Do not send non-strings to functions that expect strings.

              int x =0;

Why are you creating a local variable that is never used?

Why are you using one letter names for global variables?

If you want to clear out the letter[] array, the statement:

              strcpy(letter,cle); // added this

is not the best way to do it. First, strcpy() expects the arguments to be null terminated strings, and I'm not sure they are. Second, why use a second array when all you want to do is set letter[] to 0. A much more efficient way is to use:

              memset(letter, 0, sizeof(letter) / sizeof(letter[0]));

The memset() function goes to the memory location associated with letter[], and writes 0's to that location. The first expression in:

 sizeof(letter) / sizeof(letter[0])

determines the number of bytes the compiler allocated to the letter[] array (i.e., 159 bytes). The second expression is the number of bytes allocated for each element in the array. Since it's a char data type, you get 159/1 = 159, so the memset() function sets 159 bytes of memory to 0 starting with memory location letter[0]. This is a better way of coding this over using the constant 159 for two reasons: 1) if you change the size of letter[], the code automatically changes the size wherever its size is used, and 2) this is a "typeless" way to find the number of elements in an array. If you change letter[] to a long data type, it would still calculate the correct number of elements.