PDA

View Full Version : یه تفاوت محاسبه ای در کامپایلر ها برای تابع Strcmp



hossein2kk
یک شنبه 16 خرداد 1389, 00:45 صبح
سلام دوستان
امروز بنا به یه تمرین انشجویی داشتم تابع Strcmp رو می نوشتم که به یک نکته جالب برخوردم که گفتم شاید برای شما هم جالب باشه ، این کد من بوده :

# include <iostream.h>
# include <conio.h>

int strcmp (char* str1 , char* str2) {
while (*str1 != '\0' && *str2 != '\0' && *str1 ==*str2){
str1++;
str2++;
}
return (int) (*str2 - *str1) ;
}
int strncmp (char* str1 , char* str2 , int count) {
int i = 0;
while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2 && i < count){
str1++;
str2++;
i++;
}
return (int) (*str2 - *str1) ;
}

int main (){
int c ;
char a [40] , b[40];
cin >> a >> b >> c;
cout << "Strcmp :\nFunction return value = " << strcmp(a,b) << endl ;
cout << "\nStrncmp :\nFunction return value = " << strncmp(a,b,c) ;
getch();
return 0;
}
این کد طوریه که تا جایی که با هم برابرن یا تا وقتی که هیچ کدوم به انتها نرسیدن پیش میره و در صورت ارضا نشدن یکی از سه شرط + یه شرط تعدادی تو تابع دوم ، میاد پایین و توی اون قسمت کاراکتر هایی که رسیده رو از هم کم می کنه .
من برای جالب بود ببینم کامپایر چه خروجی برای توابع تو کار خودش میده که کدم صحیح تر باشه به خاطر همین توابعم رو کامنت کردم و String.h رو Include کردم ، وقتی به کامپایلر (ِDev-c++ 4.9.9.2)عبارت های hossein و hos و مقدار 3 کاراکتر برای مقایسه رو دادم ، تو تابع دوم که مقدار 0 رو برگردوند که خوب درستم بود ، ولی تو تابع اول مقدار 1 :متعجب: این در صورتی بود که تو Borland Turbo C++ 4.5 مقدار درست یعنی 115 رو نشون میداد ، حالا من تابعم رو بر اساس Borland نوشتم چون به نظرم درست تر بود .
البته برام این سوال بوجود اومد که این 1 رو Mingw از کجا آوردi ؟!! :متفکر:

hossein2kk
یک شنبه 16 خرداد 1389, 01:58 صبح
ممنون علی جان :چشمک:
کد منم یه مشکل داره که اینجا کامل شدش رو می ذارم :

# include <iostream.h>
# include <conio.h>

int strcmp (char* str1 , char* str2) {
while (*str1 == *str2){
str1++;
str2++;
}
return (int) (*str1 - *str2) ;
}
int strncmp (char* str1 , char* str2 , int count) {
int i = 0;
while (*str1 == *str2 && i < count-1){
str1++;
str2++;
i++;
}
return (int) (*str1 - *str2) ;
}
int main (){
int c ;
char a [40] , b[40];
cin >> a >> b >> c;
cout << "Strcmp :\nFunction return value = " << strcmp(a,b) << endl ;
cout << "\nStrncmp :\nFunction return value = " << strncmp(a,b,c) ;
getch();
return 0;
}

asheykh
سه شنبه 16 اسفند 1390, 08:42 صبح
سلام
من کار با C++‎‎ تازه شروع کردم یه کد نوشتم ولی چون فرق تابع های strcmp & strcmp & strcat و کاربرد هرکدام رو نمی دونستم کد ارور میده لطفا راهنمایی کنید منتظرما!!:متفکر:

#include<iostream.h>
#include<conio.h>
#include<string.h>
void sort(char x[][20],int raw);
int search(char x [][20],int raw);
int main()
{
char x [10][20];
for(int i = 0; i <10 ; i++)
cin.get(x[i],20)
sort(x,10)
if(search(x,10) > = 0)

cout <<" find ";
else
cout <<" not find";
}
//************************************************** ************
void sort(char x[][20],int raw);
char temp[20];
for(int i=raw-1;i>0;j--)
for(int j=0;j<i;j++)
if(strcmp(x[j] x[j+1])>0)
{
strcpy(temp,x[j]);
strcpy(x[j],x[j+1]);
strcpy(x[j+1]= temp );
}
int search(char x[][20];int raw);
{
char temp[20];
cin.get(temp)
int low = 0;
int high = low - 1;
while(low < = high)
int mid = (low + high)/2;
if(strcmp(temp,x[mid])==0)
return mid;
else if(strcmp(temp,x[mid]>0))
low = mid + 1;
else
high = mid - 1; {
return -1;
}