There's no reason to copy strings, he could just swap the pointer values...
Code:temp = str1; str1 = str2; str2 = temp;
There's no reason to copy strings, he could just swap the pointer values...
Code:temp = str1; str1 = str2; str2 = temp;
There are several problems with that.
First, those changes will be local to the function. That's not the point of the whole.
Secondly, zel wants to truncate everything in the string after N characters. Your code does not take that into account, though it is possible.
Thirdly, only N characters from the source should be copied to dst. The source shall remain unaffected!
So I did this:
it compiles with no problems,but if I run it and put for example "nikos" and "bananas", the result of string1 for N=3 is "banos" instead of "ban". Why does this happen? I thought I null-terminated the string.Code:void copy( char* str1,char* str2, int N) { int i,len1,len2; for (i=0; str1[i] != '\0'; i++){ len1= i; } for (i=0; str2[i] != '\0'; i++){ len2= i; } if (i!= N){ for (i=0;i<N;i++){ if (len2<N){ str1[i]= '\0'; } str1[i]=str2[i]; } } else { str1[i]='\0'; } printf("%s\n",str1); }
I think my if-else is the problem. I have to check it somehow else.
_________
EDIT:
I think I should be more careful sometimes.Haha.I found my mistake and did like this:
I'm happy now !Code:for (i=0; str1[i] != '\0'; i++){ len1= i; } for (i=0; str2[i] != '\0'; i++){ len2= i; } while (i!= N){ for (i=0;i<N;i++){ if (len2<N){ str1[i]= '\0'; } str1[i]=str2[i]; } } for (i=N;i<len1;i++){ str1[i]='\0'; }
Last edited by zel; 09-08-2010 at 08:37 AM.
I suggest that you indent your code properly. I read:Originally Posted by zel
I do not understand why you compare i != N in the first place: it looks wrong since when i == N, i.e., when the length of the second string is equal to N, you only null terminate the first string at index i, without copying.Code:if (i != N) { for (i = 0; i < N; i++) { if (len2 < N) { str1[i] = '\0'; } str1[i] = str2[i]; } } else { str1[i] = '\0'; }
Looking at your for loop, you assign a null character to str1[i] if len < N. But even when this happens, you immediately overwrite it with str2[i].
I think you should keep things simple: do not determine the length of either of the strings. Rather, just start copying until you reach either the end of the second string, or your counter reaches N, whichever comes first. When that happens, null terminate the first string at that point.
Look up a C++ Reference and learn How To Ask Questions The Smart WayOriginally Posted by Bjarne Stroustrup (2000-10-14)
Oh sorry. I didn't see your answer. Is my code now correct?
Test before asking. Even if it is correct, it looks like a Rube Goldberg machine.Originally Posted by zel
Look up a C++ Reference and learn How To Ask Questions The Smart WayOriginally Posted by Bjarne Stroustrup (2000-10-14)
Haha. I see that.
OK.
it runs properly except :
1) that if eg. len2=5 and I give 5 as N,it does no changes.
and
2)if eg. len2=5 and I give 10 ,it never goes out of the loop.
gr..I made it too complicated you think?
Yes, too complicated. You only need one loop, and you do not even need another if statement.
Look up a C++ Reference and learn How To Ask Questions The Smart WayOriginally Posted by Bjarne Stroustrup (2000-10-14)
Ok, it was that simple and I've stuck here for so much time...:$
I don't know why I think so complicated. THANK YOU very MUCH for your help. You really made me think. Thanks again.It works in each case.Code:for (i=0;i<N && str2[i]!='\0';i++){ str1[i]=str2[i]; } str1[i]= '\0';
Yes, that is pretty much what I had in mind
Still, you should indent the code properly, and I recommend adding some whitespace for formatting, e.g.,
Code:for (i = 0; i < N && str2[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0';
Look up a C++ Reference and learn How To Ask Questions The Smart WayOriginally Posted by Bjarne Stroustrup (2000-10-14)