Anything wrong
-
BYTE message[5]; message[0] = 15; message[1] = 33; message[2] = 2; message[3] = 23; message[4] = 33; . . . . . int messageLengh = 60; char szLogBuff [512]={0}; for(int i=0;i<messageLengh;i++) { char chz[4]={0}; sprintf(chz,"%d ",i); strcat(szLogBuff,chz); } printf(szLogBuff);
Do you find anything wrong with this code? Do I need to pad the buffer with a '\0'? or just assigning 0 to the buffer initially is fine?:beer:
-
BYTE message[5]; message[0] = 15; message[1] = 33; message[2] = 2; message[3] = 23; message[4] = 33; . . . . . int messageLengh = 60; char szLogBuff [512]={0}; for(int i=0;i<messageLengh;i++) { char chz[4]={0}; sprintf(chz,"%d ",i); strcat(szLogBuff,chz); } printf(szLogBuff);
Do you find anything wrong with this code? Do I need to pad the buffer with a '\0'? or just assigning 0 to the buffer initially is fine?:beer:
Smith# wrote:
Do you find anything wrong with this code?
Do I need to pad the buffer with a '\0'? or just assigning 0 to the buffer initially is fine?yes. no. yes. [MODIFIED] if it really is the indexes you want to print, then it is: no. no. yes. (but why show all the message stuff then?) [/MODIFIED] :)
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
modified on Thursday, March 31, 2011 2:26 PM
-
Smith# wrote:
Do you find anything wrong with this code?
Do I need to pad the buffer with a '\0'? or just assigning 0 to the buffer initially is fine?yes. no. yes. [MODIFIED] if it really is the indexes you want to print, then it is: no. no. yes. (but why show all the message stuff then?) [/MODIFIED] :)
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
modified on Thursday, March 31, 2011 2:26 PM
-
BYTE message[5]; message[0] = 15; message[1] = 33; message[2] = 2; message[3] = 23; message[4] = 33; . . . . . int messageLengh = 60; char szLogBuff [512]={0}; for(int i=0;i<messageLengh;i++) { char chz[4]={0}; sprintf(chz,"%d ",i); strcat(szLogBuff,chz); } printf(szLogBuff);
Do you find anything wrong with this code? Do I need to pad the buffer with a '\0'? or just assigning 0 to the buffer initially is fine?:beer:
The code (albeit not beautiful) is correct. With
szLogBuf[512]={0};
you actually initialize the whole buffer with 0 (that is '\0'). :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
The code (albeit not beautiful) is correct. With
szLogBuf[512]={0};
you actually initialize the whole buffer with 0 (that is '\0'). :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
Since you are dealing with strings there isn't a need to clear the whole buffer. char x[100] = { 0 }; internally calls memset. In your case it's a waste of (7 or so not including the loop inside memset) CPU cycles. char x[100]; x[0] = 0; initially creates an empty string. Just 1 CPU cycle. But then, calling functions like strcpy and sprintf don't require the buffer to be empty whereas strcat NEEDS a string (empty or otherwise) to append to.
Waldermort
-
Since you are dealing with strings there isn't a need to clear the whole buffer. char x[100] = { 0 }; internally calls memset. In your case it's a waste of (7 or so not including the loop inside memset) CPU cycles. char x[100]; x[0] = 0; initially creates an empty string. Just 1 CPU cycle. But then, calling functions like strcpy and sprintf don't require the buffer to be empty whereas strcat NEEDS a string (empty or otherwise) to append to.
Waldermort
-
whereas strcat NEEDS a string (empty or otherwise) to append to. so I'll have to memset everything to 0 or initialize everything to 0 right?
:beer:
No. When dealing with string buffers you only need to set the first char/wchar/tchar to 0.
char myString[100]; // Is a buffer of 100 chars the a string may be copied into. strcat( myString, "Hello World!" ); // will fail because the buffer is full of junk. // but strcpy( myString, "World!" ); // will work because it doesn't care what is in the buffer myString[0] = 0; // copies an empty string to the buffer strcat( myString, "Hello World!" ); // appends the string to the empty string ( also sets the character after '!' to \0 or NULL.
The new string is actually 13 chars because there is a 0 at the end. On another note. You shouldn't be using those string functions. There are safer versions available:strcpy_s( myString, 100, "Hello World!" );
These check to make sure the buffer is large enough for the string Also, you might want to read up on TCHAR and the unicode/ansi string functionsTCHAR myString[100]; _tcscpy_s( myString, 100, _T("Hello World!");
Waldermort
-
The code (albeit not beautiful) is correct. With
szLogBuf[512]={0};
you actually initialize the whole buffer with 0 (that is '\0'). :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]CPallini wrote:
The code ... is correct.
:thumbsdown:
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
-
The first yes makes me not to click on the x of this window. Could you please tell me what is wrong with the code before I click on x?
:beer:
Smith# wrote:
char chz[4]={0};
this buffer is too small, your sprintf statement may generate a minus sign, three digits, a space, and a NULL, that is 6 characters. 60 of these could take up to 301 chars, so
char szLogBuff [512]={0};
is sufficiently large, and as others already pointed out, your total initialization is a waste, as each strcat will move the initial terminating NULL backwards. BTW: you could get the correct result with less code, and save some cycles, and never have the bug you had, by having sprintf() fill the final buffer right away; all it takes is a variable pointer as the destination, initialized to szLogBuff, and incremented by the return value of sprintf! :)Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
-
CPallini wrote:
The code ... is correct.
:thumbsdown:
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
It isn't wrong. It isn't elegant nor optimal, but not wrong. I think this is a great achievement, after all. (It's a subliminal suggestion for you: could you please hire the OP?)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
Smith# wrote:
char chz[4]={0};
this buffer is too small, your sprintf statement may generate a minus sign, three digits, a space, and a NULL, that is 6 characters. 60 of these could take up to 301 chars, so
char szLogBuff [512]={0};
is sufficiently large, and as others already pointed out, your total initialization is a waste, as each strcat will move the initial terminating NULL backwards. BTW: you could get the correct result with less code, and save some cycles, and never have the bug you had, by having sprintf() fill the final buffer right away; all it takes is a variable pointer as the destination, initialized to szLogBuff, and incremented by the return value of sprintf! :)Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
Luc Pattyn wrote:
your sprintf statement may generate a minus sign
No, it cannot. ;P
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
It isn't wrong. It isn't elegant nor optimal, but not wrong. I think this is a great achievement, after all. (It's a subliminal suggestion for you: could you please hire the OP?)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]CPallini wrote:
It isn't elegant
true.
CPallini wrote:
nor optimal
true.
CPallini wrote:
not wrong
false. see my reply to OP. :)
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
-
Luc Pattyn wrote:
your sprintf statement may generate a minus sign
No, it cannot. ;P
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]from the code snippet I can't tell what the definition of BYTE is, could be signed, could be unsigned; I prepare for the worst. Anyway, it isn't really relevant, the buffer isn't sufficiently large. :)
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
-
CPallini wrote:
It isn't elegant
true.
CPallini wrote:
nor optimal
true.
CPallini wrote:
not wrong
false. see my reply to OP. :)
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
from the code snippet I can't tell what the definition of BYTE is, could be signed, could be unsigned; I prepare for the worst. Anyway, it isn't really relevant, the buffer isn't sufficiently large. :)
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
You didn't read the snippet, did you? (hint: it _s_prints the index, the BYTE part is completely insignificant). :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
You didn't read the snippet, did you? (hint: it _s_prints the index, the BYTE part is completely insignificant). :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]How silly. So that must be wrong too. :laugh:
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
-
How silly. So that must be wrong too. :laugh:
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
:laugh:
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]