View previous topic :: View next topic |
Author |
Message |
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
Compare a character of a string |
Posted: Fri Jan 08, 2021 7:36 am |
|
|
I want to compare the first character of a string, with another string, but i always get true(no match).
Here is the way i declare them:
Code: |
char usb_buffer[64];
char trig[]="|"; |
and my compare
Code: |
if (strcmp(usb_buffer[0],trig[0])) |
i've also tried
Code: | if (strcmp(usb_buffer[0],trig)) |
and
Code: | if (strncmp(usb_buffer[0],trig[0],1)) |
and countless others.
Let me mark that this works:
Code: | if (!strcmp(usb_buffer,adcs)) |
I tried to print usb_buffer[0] to see what is there and i can see characters that i shouldn't (numbers etc).
What is the correct way for my comparison?
Thank you |
|
|
benoitstjean
Joined: 30 Oct 2007 Posts: 566 Location: Ottawa, Ontario, Canada
|
|
Posted: Fri Jan 08, 2021 8:00 am |
|
|
You're attempting to compare a single character from that string using a function to compare strings.
If you want to compare the first character, then just do this:
Code: | if( usb_buffer[0] != trig[0] ) |
As for this: if (!strcmp(usb_buffer,adcs))
Then for sure it will work since you're using the function correctly and you're comparing the strings. You don't need to put the ! since this will give you the opposite result.
Ben |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jan 08, 2021 8:16 am |
|
|
benoitstjean wrote: | You don't need to put the ! since this will give you the opposite result.
|
strcmp() returns 0 (FALSE) if it's a match, so prefixing it with '!' makes it
return 1 (TRUE) if there's a match. Using '!' converts the result to positive
logic, which is how people normally think. |
|
|
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
|
Posted: Fri Jan 08, 2021 8:28 am |
|
|
benoitstjean wrote: | You're attempting to compare a single character from that string using a function to compare strings.
If you want to compare the first character, then just do this:
Code: | if( usb_buffer[0] != trig[0] ) |
As for this: if (!strcmp(usb_buffer,adcs))
Then for sure it will work since you're using the function correctly and you're comparing the strings. You don't need to put the ! since this will give you the opposite result.
Ben |
Thank you , that worked!
Code: | memset( usb_buffer, NULL, 64 );
|
you wrote before was usefull too, i used to use a loop for that, this is much nicer.
Thank you PCM programer, i have it in mind.
One step more . now i want to remove the first character (|) from usb_buffer. How is this possible with a smart way?
i tried shifting << but compiler disagrees ... : Assignment invalid: lvalue is READ ONLY
if no way i have to test a loop shifting one by one ( hoping it works) |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Fri Jan 08, 2021 8:43 am |
|
|
Shifting is for bits inside a variable. To move a string, you would have to use
strcpy, or memmove. However both would involve a lot of work.
Why move it?. Just don't copy this value out of the buffer. |
|
|
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
|
Posted: Fri Jan 08, 2021 8:56 am |
|
|
Ttelmah wrote: | Shifting is for bits inside a variable. To move a string, you would have to use
strcpy, or memmove. However both would involve a lot of work.
Why move it?. Just don't copy this value out of the buffer, |
The full story is that if i use | symbol when typing, then the text that follows will be sent to another serial port that a modem listens.
I wanted to have it clean and send it transparently.
Code: | fputs(usb_buffer,SERIAL); |
Probably it will be more messy to send bytes usb_buffer[1]...to end rather than correcting it before. At least with my limited knowledge. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Fri Jan 08, 2021 11:03 am |
|
|
No, _much_ cleaner.
fputs(&usb_buffer[1],SERIAL);
This involves zero work.
However to use fputs, the data in the buffer needs to have a null terminator.
Is it being sent with such a terminator?. |
|
|
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
|
Posted: Fri Jan 08, 2021 11:46 am |
|
|
No i don't add null. After the fputs however, i use putc; command as many times as the characters are to be sent and they leave.
By your sayings i understand that i didn't have to use putc! I will give it a try.
Or it could be the fact that i initialise usb_buffer with /0 before i fill it up, so null is found by fputs... I have many test to perform to understand.
Meanwhile i tried
Code: | for(pointers=0;pointers<(strlen(usb_buffer)+2);pointers++)
{
usb_buffer[pointers]=usb_buffer[pointers+1];
} |
and looks working, i will keep the second solution to my notepad! |
|
|
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
|
Posted: Wed Feb 24, 2021 2:04 pm |
|
|
Ttelmah wrote: | No, _much_ cleaner.
fputs(&usb_buffer[1],SERIAL);
This involves zero work.
However to use fputs, the data in the buffer needs to have a null terminator.
Is it being sent with such a terminator?. |
Hi again. I'm not sure whether i should open a new thread since it's a follow up.
I used this code in this form:
Code: | sprintf(usb_buffer,"%s\r",&ser_phrase[5]); |
As you suggested and it works, but now I want to omit the last 2 characters of ser_phrase.
So if it's 10 bytes long (0..9), I want to copy 4 to 7.
Is there any smart way to do that either while executing this sprintf OR removing these 2 last bytes from usb_buffer string after sprintf ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Thu Feb 25, 2021 2:38 am |
|
|
Since the usb_buffer will itself be treated as a string, then:
Code: |
sprintf(usb_buffer,"%s\r",&ser_phrase[5]);
usb_buffer[4]='\0';
|
Should stop the transmission after 4 characters. |
|
|
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
|
Posted: Thu Feb 25, 2021 3:28 am |
|
|
Ok. Since string is variable, i will get the length with strln and adjust the command.
Thanks |
|
|
|