Question: C语言怎样打印出当前的时间呢？

引用 13 楼 ForestDB 的回复:system("date"); 时间呢？ system("@echo %date% %time%");

#include <stdio.h> #include <time.h> #include <unistd.h> int main (void ) {     time_t Curtime;     tm sTime = {0};     while(1)     {            time(&Curtime);          tm *RetTime = localtime( &Curtime );         printf("Time: %04d-%02d-%02d %02d:%02d:%02d \r"                 ,RetTime->tm_year + 1900                 ,RetTime->tm_mon + 1                  ,RetTime->tm_mday                 ,RetTime->tm_hour                 ,RetTime->tm_min                 ,RetTime->tm_sec);         sleep(1);         fflush(stdout);     }         return 0; }

system("date");

GetLocalTime

#include  <time.h>  #include  <stdio.h>  void main()  {           time_t timep;           time (&timep);           printf("%s",asctime(gmtime(&timep)));  }

引用 3 楼 u012840458 的回复: #include  <time.h> #include  <stdio.h> void main() {      time_t timep;      time (&timep);      printf("%s",asctime(gmtime(&timep)));// printf("%s",ctime(&timep)); } 这个也可以

time_t		tCurTime=time(NULL); 	struct tm*	ptmCurTime=localtime(&tCurTime);	  	printf("%04d%02d%02d %02d%02d%02d\n", 		ptmCurTime->tm_year+1900,ptmCurTime->tm_mon+1,ptmCurTime->tm_mday,ptmCurTime->tm_hour,ptmCurTime->tm_min,ptmCurTime->tm_sec);

格式不做严格要求，只要能打印出日期和时间就行。

接上帖 If a conversion specification does not correspond to any of the above, the behavior is undefined.  If a struct tm broken-down time structure is created by localtime() or localtime_r(), or modified by mktime(), and the value of TZ is subsequently modified, the results of the %Z and %z strftime() conversion specifiers are undefined, when strftime() is called with such a broken-down time structure.  If a struct tm broken-down time structure is created or modified by gmtime() or gmtime_r(), it is unspecified whether the result of the %Z and %z conversion specifiers shall refer to UTC or the current local timezone, when strftime() is called with such a broken-down time structure.     Modified Conversion Specifiers Some conversion specifiers can be modified by the E or O modifier characters to indicate that an alternative format or specification should be used rather than the one normally used by the unmodified conversion specifier. If the alternative format or specification does not exist for the current locale (see ERA in the Base Definitions volume of IEEE Std 1003.1-2001, Section 7.3.5, LC_TIME), the behavior shall be as if the unmodified conversion specification were used.   %Ec Replaced by the locale's alternative appropriate date and time representation.  %EC Replaced by the name of the base year (period) in the locale's alternative representation.  %Ex Replaced by the locale's alternative date representation.  %EX Replaced by the locale's alternative time representation.  %Ey Replaced by the offset from %EC (year only) in the locale's alternative representation.  %EY Replaced by the full alternative year representation.  %Od Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading zeros if there is any alternative symbol for zero; otherwise, with leading spaces.  %Oe Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading spaces.  %OH Replaced by the hour (24-hour clock) using the locale's alternative numeric symbols.  %OI Replaced by the hour (12-hour clock) using the locale's alternative numeric symbols.  %Om Replaced by the month using the locale's alternative numeric symbols.  %OM Replaced by the minutes using the locale's alternative numeric symbols.  %OS Replaced by the seconds using the locale's alternative numeric symbols.  %Ou Replaced by the weekday as a number in the locale's alternative representation (Monday=1).  %OU Replaced by the week number of the year (Sunday as the first day of the week, rules corresponding to %U ) using the locale's alternative numeric symbols.  %OV Replaced by the week number of the year (Monday as the first day of the week, rules corresponding to %V ) using the locale's alternative numeric symbols.  %Ow Replaced by the number of the weekday (Sunday=0) using the locale's alternative numeric symbols.  %OW Replaced by the week number of the year (Monday as the first day of the week) using the locale's alternative numeric symbols.  %Oy Replaced by the year (offset from %C ) using the locale's alternative numeric symbols.   %g , %G , and %V give values according to the ISO 8601:2000 standard week-based year. In this system, weeks begin on a Monday and week 1 of the year is the week that includes January 4th, which is also the week that includes the first Thursday of the year, and is also the first week that contains at least four days in the year. If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of the last week of the preceding year; thus, for Saturday 2nd January 1999, %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, or 31st is a Monday, it and any following days are part of week 1 of the following year. Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01.   If a conversion specifier is not one of the above, the behavior is undefined.     RETURN VALUE If the total number of resulting bytes including the terminating null byte is not more than maxsize, strftime() shall return the number of bytes placed into the array pointed to by s, not including the terminating null byte. Otherwise, 0 shall be returned and the contents of the array are unspecified.     ERRORS No errors are defined.   The following sections are informative.     EXAMPLES    Getting a Localized Date String The following example first sets the locale to the user's default. The locale information will be used in the nl_langinfo() and strftime() functions. The nl_langinfo() function returns the localized date string which specifies how the date is laid out. The strftime() function takes this information and, using the tm structure for values, places the date and time information into datestring.     #include <time.h> #include <locale.h> #include <langinfo.h> ... struct tm *tm; char datestring[256]; ... setlocale (LC_ALL, ""); ... strftime (datestring, sizeof(datestring), nl_langinfo (D_T_FMT), tm); ...      APPLICATION USAGE The range of values for %S is [00,60] rather than [00,59] to allow for the occasional leap second.   Some of the conversion specifications are duplicates of others. They are included for compatibility with nl_cxtime() and nl_ascxtime(), which were published in Issue 2.   Applications should use %Y (4-digit years) in preference to %y (2-digit years).   In the C locale, the E and O modifiers are ignored and the replacement strings for the following specifiers are:   %a The first three characters of %A .  %A One of Sunday, Monday, ..., Saturday.  %b The first three characters of %B .  %B One of January, February, ..., December.  %c Equivalent to %a %b %e %T %Y .  %p One of AM or PM.  %r Equivalent to %I : %M : %S %p .  %x Equivalent to %m / %d / %y .  %X Equivalent to %T .  %Z Implementation-defined.      RATIONALE None.     FUTURE DIRECTIONS None.     SEE ALSO asctime() , clock() , ctime() , difftime() , getdate() , gmtime() , localtime() , mktime() , strptime() , time() , tzset() , utime() , Base Definitions volume of IEEE Std 1003.1-2001, Section 7.3.5, LC_TIME, <time.h>     COPYRIGHT Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. In the event of any discrepancy between this version and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.opengroup.org/unix/online.html .  --------------------------------------------------------------------------------

STRFTIME Section: POSIX Programmer's Manual (P) Updated: 2003  --------------------------------------------------------------------------------    NAME strftime - convert date and time to a string    SYNOPSIS #include <time.h>    size_t strftime(char *restrict s, size_t maxsize,         const char *restrict format, const struct tm *restrict timeptr);      DESCRIPTION The strftime() function shall place bytes into the array pointed to by s as controlled by the string pointed to by format. The format is a character string, beginning and ending in its initial shift state, if any. The format string consists of zero or more conversion specifications and ordinary characters. A conversion specification consists of a '%' character, possibly followed by an E or O modifier, and a terminating conversion specifier character that determines the conversion specification's behavior. All ordinary characters (including the terminating null byte) are copied unchanged into the array. If copying takes place between objects that overlap, the behavior is undefined. No more than maxsize bytes are placed into the array. Each conversion specifier is replaced by appropriate characters as described in the following list. The appropriate characters are determined using the LC_TIME category of the current locale and by the values of zero or more members of the broken-down time structure pointed to by timeptr, as specified in brackets in the description. If any of the specified values are outside the normal range, the characters stored are unspecified.   Local timezone information is used as though strftime() called tzset().   The following conversion specifications are supported:   %a Replaced by the locale's abbreviated weekday name. [ tm_wday]  %A Replaced by the locale's full weekday name. [ tm_wday]  %b Replaced by the locale's abbreviated month name. [ tm_mon]  %B Replaced by the locale's full month name. [ tm_mon]  %c Replaced by the locale's appropriate date and time representation. (See the Base Definitions volume of IEEE Std 1003.1-2001, <time.h>.)  %C Replaced by the year divided by 100 and truncated to an integer, as a decimal number [00,99]. [ tm_year]  %d Replaced by the day of the month as a decimal number [01,31]. [ tm_mday]  %D Equivalent to %m / %d / %y . [ tm_mon, tm_mday, tm_year]  %e Replaced by the day of the month as a decimal number [1,31]; a single digit is preceded by a space. [ tm_mday]  %F Equivalent to %Y - %m - %d (the ISO 8601:2000 standard date format). [ tm_year, tm_mon, tm_mday]  %g Replaced by the last 2 digits of the week-based year (see below) as a decimal number [00,99]. [ tm_year, tm_wday, tm_yday]  %G Replaced by the week-based year (see below) as a decimal number (for example, 1977). [ tm_year, tm_wday, tm_yday]  %h Equivalent to %b . [ tm_mon]  %H Replaced by the hour (24-hour clock) as a decimal number [00,23]. [ tm_hour]  %I Replaced by the hour (12-hour clock) as a decimal number [01,12]. [ tm_hour]  %j Replaced by the day of the year as a decimal number [001,366]. [ tm_yday]  %m Replaced by the month as a decimal number [01,12]. [ tm_mon]  %M Replaced by the minute as a decimal number [00,59]. [ tm_min]  %n Replaced by a <newline>. %p Replaced by the locale's equivalent of either a.m. or p.m. [ tm_hour]  %r Replaced by the time in a.m. and p.m. notation;  in the POSIX locale this shall be equivalent to %I : %M : %S %p . [ tm_hour, tm_min, tm_sec]  %R Replaced by the time in 24-hour notation ( %H : %M ). [ tm_hour, tm_min]  %S Replaced by the second as a decimal number [00,60]. [ tm_sec]  %t Replaced by a <tab>.  %T Replaced by the time ( %H : %M : %S ). [ tm_hour, tm_min, tm_sec]  %u Replaced by the weekday as a decimal number [1,7], with 1 representing Monday. [ tm_wday]  %U Replaced by the week number of the year as a decimal number [00,53]. The first Sunday of January is the first day of week 1; days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]  %V Replaced by the week number of the year (Monday as the first day of the week) as a decimal number [01,53]. If the week containing 1 January has four or more days in the new year, then it is considered week 1. Otherwise, it is the last week of the previous year, and the next week is week 1. Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday]  %w Replaced by the weekday as a decimal number [0,6], with 0 representing Sunday. [ tm_wday]  %W Replaced by the week number of the year as a decimal number [00,53]. The first Monday of January is the first day of week 1; days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] %x Replaced by the locale's appropriate date representation. (See the Base Definitions volume of IEEE Std 1003.1-2001, <time.h>.) %X Replaced by the locale's appropriate time representation. (See the Base Definitions volume of IEEE Std 1003.1-2001, <time.h>.) %y Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] %Y Replaced by the year as a decimal number (for example, 1997). [ tm_year] %z Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ), or by no characters if no timezone is determinable. For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich).  If tm_isdst is zero, the standard time offset is used. If tm_isdst is greater than zero, the daylight savings time offset is used. If tm_isdst is negative, no characters are returned. [ tm_isdst] %Z Replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists. [ tm_isdst] %% Replaced by % .  未完待续

#include <stdio.h> #include <time.h> int main() {     time_t tt;     char tmpbuf[80];      tt=time(NULL);     strftime(tmpbuf,80,"%Y-%m-%d %H:%M:%S\n",localtime(&tt));     printf(tmpbuf);     return 0; }  strftime, wcsftime Format a time string.  size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr );  size_t wcsftime( wchar_t *strDest, size_t maxsize, const wchar_t *format, const struct tm *timeptr );  Routine Required Header Compatibility  strftime <time.h> ANSI, Win 95, Win NT  wcsftime <time.h> or <wchar.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  strftime returns the number of characters placed in strDest if the total number of resulting characters, including the terminating null, is not more than maxsize. wcsftime returns the corresponding number of wide characters. Otherwise, the functions return 0, and the contents of strDest is indeterminate.  Parameters  strDest  Output string  maxsize  Maximum length of string  format  Format-control string  timeptr  tm data structure  Remarks  The strftime and wcsftime functions format the tm time value in timeptr according to the supplied format argument and store the result in the buffer strDest. At most, maxsize characters are placed in the string. For a description of the fields in the timeptr structure, see asctime. wcsftime is the wide-character equivalent of strftime; its string-pointer argument points to a wide-character string. These functions behave identically otherwise.  Note   Prior to this version of Visual C++, the documentation described the format parameter of wcsftime as having the datatype const wchar_t *, but the actual implementation of the format datatype was const char *. In this version, the implementation of the format datatype has been updated to reflect the previous and current documentation, that is: const wchar_t *.  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tcsftime strftime  strftime wcsftime    The format argument consists of one or more codes; as in printf, the formatting codes are preceded by a percent sign (%). Characters that do not begin with % are copied unchanged to strDest. The LC_TIME category of the current locale affects the output formatting of strftime.(For more information on LC_TIME, see setlocale.) The formatting codes for strftime are listed below:  %a  Abbreviated weekday name  %A  Full weekday name  %b  Abbreviated month name  %B  Full month name  %c  Date and time representation appropriate for locale  %d  Day of month as decimal number (01 – 31)  %H  Hour in 24-hour format (00 – 23)  %I  Hour in 12-hour format (01 – 12)  %j  Day of year as decimal number (001 – 366)  %m  Month as decimal number (01 – 12)  %M  Minute as decimal number (00 – 59)  %p  Current locale’s A.M./P.M. indicator for 12-hour clock  %S  Second as decimal number (00 – 59)  %U  Week of year as decimal number, with Sunday as first day of week (00 – 53)  %w  Weekday as decimal number (0 – 6; Sunday is 0)  %W  Week of year as decimal number, with Monday as first day of week (00 – 53)  %x  Date representation for current locale  %X  Time representation for current locale  %y  Year without century, as decimal number (00 – 99)  %Y  Year with century, as decimal number  %z, %Z  Time-zone name or abbreviation; no characters if time zone is unknown  %%  Percent sign  As in the printf function, the # flag may prefix any formatting code. In that case, the meaning of the format code is changed as follows.  Format Code Meaning  %#a, %#A, %#b, %#B, %#p, %#X, %#z, %#Z, %#% # flag is ignored.  %#c Long date and time representation, appropriate for current locale. For example: “Tuesday, March 14, 1995, 12:41:29”.  %#x Long date representation, appropriate to current locale. For example: “Tuesday, March 14, 1995”.  %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y Remove leading zeros (if any).    Example  /* TIMES.C illustrates various time and date functions including:  *      time            _ftime          ctime       asctime  *      localtime       gmtime          mktime      _tzset  *      _strtime        _strdate        strftime  *  * Also the global variable:  *      _tzname  */  #include <time.h> #include <stdio.h> #include <sys/types.h> #include <sys/timeb.h> #include <string.h>  void main() {     char tmpbuf[128], ampm[] = "AM";     time_t ltime;     struct _timeb tstruct;     struct tm *today, *gmt, xmas = { 0, 0, 12, 25, 11, 93 };      /* Set time zone from TZ environment variable. If TZ is not set,      * the operating system is queried to obtain the default value       * for the variable.       */     _tzset();      /* Display operating system-style date and time. */     _strtime( tmpbuf );     printf( "OS time:\t\t\t\t%s\n", tmpbuf );     _strdate( tmpbuf );     printf( "OS date:\t\t\t\t%s\n", tmpbuf );      /* Get UNIX-style time and display as number and string. */     time( <ime );     printf( "Time in seconds since UTC 1/1/70:\t%ld\n", ltime );     printf( "UNIX time and date:\t\t\t%s", ctime( <ime ) );      /* Display UTC. */     gmt = gmtime( <ime );     printf( "Coordinated universal time:\t\t%s", asctime( gmt ) );      /* Convert to time structure and adjust for PM if necessary. */     today = localtime( <ime );     if( today->tm_hour > 12 )     {    strcpy( ampm, "PM" );    today->tm_hour -= 12;     }     if( today->tm_hour == 0 )  /* Adjust if midnight hour. */    today->tm_hour = 12;      /* Note how pointer addition is used to skip the first 11       * characters and printf is used to trim off terminating       * characters.      */     printf( "12-hour time:\t\t\t\t%.8s %s\n",        asctime( today ) + 11, ampm );      /* Print additional time information. */     _ftime( &tstruct );     printf( "Plus milliseconds:\t\t\t%u\n", tstruct.millitm );     printf( "Zone difference in seconds from UTC:\t%u\n",               tstruct.timezone );     printf( "Time zone name:\t\t\t\t%s\n", _tzname[0] );     printf( "Daylight savings:\t\t\t%s\n",               tstruct.dstflag ? "YES" : "NO" );      /* Make time for noon on Christmas, 1993. */     if( mktime( &xmas ) != (time_t)-1 )    printf( "Christmas\t\t\t\t%s\n", asctime( &xmas ) );      /* Use time structure to build a customized time string. */     today = localtime( <ime );      /* Use strftime to build a customized time string. */     strftime( tmpbuf, 128,          "Today is %A, day %d of %B in the year %Y.\n", today );     printf( tmpbuf ); }    Output  OS time:                                21:51:03 OS date:                                05/03/94 Time in seconds since UTC 1/1/70:       768027063 UNIX time and date:                     Tue May 03 21:51:03 1994 Coordinated universal time:             Wed May 04 04:51:03 1994 12-hour time:                           09:51:03 PM Plus milliseconds:                      279 Zone difference in seconds from UTC:    480 Time zone name:                          Daylight savings:                       YES Christmas                               Sat Dec 25 12:00:00 1993  Today is Tuesday, day 03 of May in the year 1994.   Locale Routines, Time Management Routines |  String Manipulation Routines  See Also   localeconv, setlocale, strcoll, _stricoll, strxfrm

linux下直接date命令


Question: HPUNIX如何编译OCI的C程序，需要带哪些参数？

看来问题无法解决了！

难道用HP服务器的公司很少吗！有没有大侠知道啊！

没有HPUNIX环境，帮你顶一下！  引用 1 楼 zhan_horse 的回复:操作系统是64位，只是连接的时候OCCI是用-locci这个参数，连接OCI的时候改为-locijdbc10这个参数，编译才能通过。 所以想确定是不是链接的时候参数不对导致的


Question: 提问？

引用 2 楼 chenlianghx 的回复:我局部变量t没有去掉，已经解决了，谢谢 还是得注意 1楼说的问题，

我局部变量t没有去掉，已经解决了，谢谢

避免对浮点数使用<等操作


Question: c语言LRU页面置换算法

都是我，这是操作系统作业

LZ这是干嘛？ yaosanfeng ysfzxc ysf1466123304 已经三个帐号了，而且一样的至少三个问题。


Question: C 字符串指针和数组问题。

谢谢 楼上的两位

因为当使用char *p=“abcd”,也就是字符指针变量的来表示字符串数据的时候，这个字符串数据是常量，而strtok试图修改这一常量，所以非法了。 字符指针本质上是首先在存储器中存放一个字符串常量，然后将首地址赋给p

strtok函数会修改第一个参数。 以下是strtok函数的描述: Avoid using these functions.  If you do use them, note that:                These functions modify their first argument.                These functions cannot be used on constant strings.                The identity of the delimiting character is lost.                The strtok() function uses a static buffer while parsing, so it's not thread safe. Use strtok_r() if this matters to you.

如果把char *p = "abcd aaa iii lll fdiaso       123"; 改成char p[]=  "abcd aaa iii lll fdiaso       123"; 就可以。

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

引用 2 楼 wusuopuBUPT 的回复:char *p = "abcd aaa iii lll fdiaso       123";是指针常量，不允许被修改的。 请参考这里：http://stackoverflow.com/questions/13208828/strtok-segmentation-fault +1

C++试试 boost tokenizer


Question: C语言探讨，请各位大神教一下

输入二个十进制的整数（包括负数），把这二个数通过一些方法转化为二进制（8位机补码形式），输出转化后的二进制数，然后用加法得到这二个二进制数的加法结果（8位机补码形式），并输出.

仅供参考#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

计算机中都是二进制，输出即可

scanf后的变量值就是二进制补码的形式 如果是字符串表示的10进制数，使用atoi转换

不知所云！  引用 楼主 u013035720 的回复:用C语言：输入二个十进制的数字用一些方法输出相应的二进制数而且是8位机补码，并且输出那二个二进制数的和.


Question: Linux C关于获取局域网内当前所有已用IP

引用 9 楼 zustchf 的回复:现在的想法是发送arp包，广播的话，可以特定的地址然后让收到数据包的设备回复吗？ 请问楼主解决了吗 我现在在做一个小盒子通过网线接入局域网，要想在局域网获取一个可用ip地址，怎么办，因为他接入局域网时是没有ip地址的，如果没开启DHCP，怎么办是要给他先随便设一个ip吗？

最后还是决定用ARP了，就是在发送过程中会有一些奇怪的包出来，是发给路由器的，但是会被本地设备接收到，会严重影响效率，不知道这个问题怎么解决

使用sniffer软件。

arping

引用 2 楼 zustchf 的回复:[quote=引用 1 楼 user-5 的回复:] ping 该网段内的所有ip,ping不通的就是没有使用的。  效率太低，相对于用ping的方法，用arp的方法会更好，我是想找一个效率高一点的方法[/quote] 如果有arp防火墙，arp不管用

引用 1 楼 user-5 的回复:ping 该网段内的所有ip,ping不通的就是没有使用的。  效率太低，相对于用ping的方法，用arp的方法会更好，我是想找一个效率高一点的方法

ping 该网段内的所有ip,ping不通的就是没有使用的。

引用 3 楼 maoshuoqiong 的回复:[quote=引用 2 楼 zustchf 的回复:] [quote=引用 1 楼 user-5 的回复:] ping 该网段内的所有ip,ping不通的就是没有使用的。  效率太低，相对于用ping的方法，用arp的方法会更好，我是想找一个效率高一点的方法[/quote] 如果有arp防火墙，arp不管用[/quote]  是的，这是一个问题，ping也是可以被阻止的

引用 4 楼 user-5 的回复:那就给局域网发送广播包，谁没有回应对应的IP就没有使用。  这个广播包应该怎么发，我也是想这么做的，但是我困惑的是广播包发出去了，怎么让包自己回复？

引用 2 楼 zustchf 的回复:[quote=引用 1 楼 user-5 的回复:] ping 该网段内的所有ip,ping不通的就是没有使用的。  效率太低，相对于用ping的方法，用arp的方法会更好，我是想找一个效率高一点的方法[/quote]那就给局域网发送广播包，谁没有回应对应的IP就没有使用。


Question: fgetc()

引用 8 楼 turingo 的回复:我的理解就是当前字符，如果当前没有字符了，它就是EOF特殊字符。  [quote=引用 7 楼 ztzi321 的回复:] [quote=引用 5 楼 turingo 的回复:] 把EOF理解为特殊的字符就好了。  [quote=引用 4 楼 ztzi321 的回复:] [quote=引用 1 楼 turingo 的回复:] 1、当前所指; 2、能。  [quote=引用 楼主 ztzi321 的回复:] 1.返回的是下一个字符还是当前所指字符？ 2.fgetc()能返回空格类字符吗？[/quote] “fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF”如何理解？[/quote][/quote]这是应该说的不是当前字符吧？[/quote][/quote]是不是读取当前字节，把指针移到下一个字符位置？是这样理解吗？

一个文件刚刚打开，何为第一个字符，何为下一个字符？

我的理解就是当前字符，如果当前没有字符了，它就是EOF特殊字符。  引用 7 楼 ztzi321 的回复:[quote=引用 5 楼 turingo 的回复:] 把EOF理解为特殊的字符就好了。  [quote=引用 4 楼 ztzi321 的回复:] [quote=引用 1 楼 turingo 的回复:] 1、当前所指; 2、能。  [quote=引用 楼主 ztzi321 的回复:] 1.返回的是下一个字符还是当前所指字符？ 2.fgetc()能返回空格类字符吗？[/quote] “fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF”如何理解？[/quote][/quote]这是应该说的不是当前字符吧？[/quote]

引用 5 楼 turingo 的回复:把EOF理解为特殊的字符就好了。  [quote=引用 4 楼 ztzi321 的回复:] [quote=引用 1 楼 turingo 的回复:] 1、当前所指; 2、能。  [quote=引用 楼主 ztzi321 的回复:] 1.返回的是下一个字符还是当前所指字符？ 2.fgetc()能返回空格类字符吗？[/quote] “fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF”如何理解？[/quote][/quote]这是应该说的不是当前字符吧？

引用 5 楼 turingo 的回复:把EOF理解为特殊的字符就好了。  [quote=引用 4 楼 ztzi321 的回复:] [quote=引用 1 楼 turingo 的回复:] 1、当前所指; 2、能。  [quote=引用 楼主 ztzi321 的回复:] 1.返回的是下一个字符还是当前所指字符？ 2.fgetc()能返回空格类字符吗？[/quote] “fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF”如何理解？[/quote][/quote]"fgetc()函数返回来自stream(流)中的下一个字符"我说的是这句？

把EOF理解为特殊的字符就好了。  引用 4 楼 ztzi321 的回复:[quote=引用 1 楼 turingo 的回复:] 1、当前所指; 2、能。  [quote=引用 楼主 ztzi321 的回复:] 1.返回的是下一个字符还是当前所指字符？ 2.fgetc()能返回空格类字符吗？[/quote] “fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF”如何理解？[/quote]

引用 1 楼 turingo 的回复:1、当前所指; 2、能。  [quote=引用 楼主 ztzi321 的回复:] 1.返回的是下一个字符还是当前所指字符？ 2.fgetc()能返回空格类字符吗？[/quote] “fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF”如何理解？

引用 2 楼 ForestDB 的回复:何为下一个，何为当前？ fgetc( FILE *stream)是stream所指的字符还是它的下一个？

字符是表象，其对应字节值才是本质。

所指字符。 刚打开文件时ftell返回0 fgetc返回第0个字符（如果文件长度为0则返回EOF）  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

是的  引用 10 楼 ztzi321 的回复:[quote=引用 8 楼 turingo 的回复:] 我的理解就是当前字符，如果当前没有字符了，它就是EOF特殊字符。  [quote=引用 7 楼 ztzi321 的回复:] [quote=引用 5 楼 turingo 的回复:] 把EOF理解为特殊的字符就好了。  [quote=引用 4 楼 ztzi321 的回复:] [quote=引用 1 楼 turingo 的回复:] 1、当前所指; 2、能。  [quote=引用 楼主 ztzi321 的回复:] 1.返回的是下一个字符还是当前所指字符？ 2.fgetc()能返回空格类字符吗？[/quote] “fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF”如何理解？[/quote][/quote]这是应该说的不是当前字符吧？[/quote][/quote]是不是读取当前字节，把指针移到下一个字符位置？是这样理解吗？[/quote]

何为下一个，何为当前？

1、当前所指; 2、能。  引用 楼主 ztzi321 的回复:1.返回的是下一个字符还是当前所指字符？ 2.fgetc()能返回空格类字符吗？


Question: C语言的结构中可以定义成员函数吗？

引用 3 楼 u010676349 的回复:[quote=引用 2 楼 zhxianbin 的回复:] 可以用函数指针的形式实现  typedef struct {     int a;     void (*func)(int param); } aaa; 好办法！调用的时候，是用aaa.func呢还是aaa->func？[/quote]  都不是，应该是这样：  aaa  var_aaa; var_aaa.func;  或者   aaa  *pvar_aaa; pvar_aaa->func;  你用类也要实例化，除非static 函数

引用 5 楼 u010676349 的回复:[quote=引用 2 楼 zhxianbin 的回复:] 可以用函数指针的形式实现  typedef struct {     int a;     void (*func)(int param); } aaa; 很快发现一个缺点：就是如果是Ｃ++的成员函数，在调用本对象的成员变量的时候（比如a)，直接用a就行了。而这种方法，恐怕在使用a的时候，还需要加一个结构变量名，也就是aaa.a吧？[/quote] 这是必然的，因为你在用一门语言模仿另一门语言 如果用c中的一些技巧就可以达成和c++完全相同的效果，那c++跟c有什么区别？

引用 2 楼 zhxianbin 的回复:可以用函数指针的形式实现  typedef struct {     int a;     void (*func)(int param); } aaa; 很快发现一个缺点：就是如果是Ｃ++的成员函数，在调用本对象的成员变量的时候（比如a)，直接用a就行了。而这种方法，恐怕在使用a的时候，还需要加一个结构变量名，也就是aaa.a吧？

引用 2 楼 zhxianbin 的回复:可以用函数指针的形式实现  typedef struct {     int a;     void (*func)(int param); } aaa; 好办法！调用的时候，是用aaa.func呢还是aaa->func？

C没有成员函数。


Question: getchar的相关问题请教

就在刚才，我想到了怎样看“流”，就是用debugger（其实应该能早想到的） scanf("%f",&weight);之后，应该可以看到stdin的内部情况，get指针应该指向\n，表示\n还没有读取，下次读的时候，应该从此\n开始。

引用 20 楼 ForestDB 的回复:我的运行结果： Hi! What's your first name? bill<cr> bill, what's your weight in pounds? 1.1<cr> Well, bill, your volume is 0.02 cubic feet. Also, your first name has 4 letters, and we have 40 bytes to store it in. <cr> 程序结束 我的运行结果和你一样啊，按照你9L的回复，  引用 22 楼 ForestDB 的回复:重新看我9L的回复。 我明白了，非常感谢哈！

重新看我9L的回复。

引用 20 楼 ForestDB 的回复:我的运行结果： Hi! What's your first name? bill<cr> bill, what's your weight in pounds? 1.1<cr> Well, bill, your volume is 0.02 cubic feet. Also, your first name has 4 letters, and we have 40 bytes to store it in. <cr> 程序结束 对啊，程序只有两个getchar却会停在那里啊，按道理不是两个getchar吃两个回车，应该还要有一个getchar来获取用户输入的回车，程序才退出啊

引用 7 楼 ForestDB 的回复:你所有的输入（字符），都会存在于流中； 所以回车这个字符，也会在流中； 而getchar也好，scanf也好，都是从流中提取字符（自然有可能提取到回车）；  回车之所以特殊，是因为流一般是行缓冲的，即只有碰到回车之后，才把缓冲中的字符，放入流中。 那为什么下面这张图只需要两个getchar就可以呢？按照原理两个getchar吃掉两个scanf的回车，还要再有一个getchar等待用户输入回车呀？但是实验中只需要两个getchar就行了，程序不会自动退出。

引用 18 楼 ForestDB 的回复:有没有rebuild all？ 明天我试试吧 VS2010对吧 是2010，有重新生成啊！附代码如下： #include "stdafx.h" #include <string.h> #define DENSITY 62.4   int _tmain(int argc, _TCHAR* argv[]) { 	float weight,volume; 	int size,letters; 	char name[40];  	printf("Hi!What's your first name?\n"); 	scanf("%s",name); 	printf("%s,what's your weight in pounds?\n",name); 	scanf("%f",&weight); 	size=sizeof name; 	letters=strlen(name); 	volume=weight/DENSITY; 	printf("Well,%s,your volume is %2.2f cubic feet.\n", 		name,volume); 	printf("Also,your first name has %d letters,\n",letters); 	printf("and we have %d bytes to store it in.\n",size); 	getchar(); 	getchar(); 	return 0; }

引用 1 楼 max_min_ 的回复:因为每次scanf输入的时候都有一个回车符留在缓冲区里的 getchar其实是吃掉了每次输入的回车符，如果没有的话，下次scanf的话，就会先读上次一次输入的回车符了！ 那下次scanf读到上次输入的回车就直接退出了？

引用 4 楼 ForestDB 的回复:注意理解“流”stream这个概念。 不太理解额，能否给我讲解一下“流”这个东西呢？

有没有rebuild all？ 明天我试试吧 VS2010对吧

引用 14 楼 ForestDB 的回复:你运行时有无press any key to continue之类的东西？ 没有啊，所以感到纳闷 如下图

引用 13 楼 u011623102 的回复:你看仔细了，你改后明明有3个getchar。 那个没改清楚，你把scanf后面那个getchar代码去了，还是正常运行的。

引用 1 楼 max_min_ 的回复:因为每次scanf输入的时候都有一个回车符留在缓冲区里的 getchar其实是吃掉了每次输入的回车符，如果没有的话，下次scanf的话，就会先读上次一次输入的回车符了！  正解。 你可以把scanf注释掉试试看。

你运行时有无press any key to continue之类的东西？

你看仔细了，你改后明明有3个getchar。

引用 9 楼 ForestDB 的回复:Hi! What's your first name? bill<cr> // scanf("%s", name); bill, what's your weight in pounds? 1.1<cr> // scanf("%f", &weight); getchar(); <cr> // getchar();  输入流为： bill<cr 1>1.1<cr 2><cr 3> scanf("%s", name);从流中提取bill，遇到<cr 1>停止，<cr 1>由于没有提取，仍在流中； scanf("%f", &weight);（略过<cr 1>，因为它不是float），提取1.1，遇到<cr 2>停止，<cr 2>没有提取，仍在流中； getchar();提取<cr 2>； getchar();提取<cr 3>； 程序结束。 如果按照这样下来的话，程序结束后就会自动退出了，但是实际情况是还在等待用户输入回车，这是我困惑的地方。

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

引用 2 楼 pokerLee 的回复:为什么你的主程序是int _tmain()呢? 因为用的是VS，默认就是这个！


Question: 获取一个int变量某一位的bit值，试问以下GetBit函数有问题吗？

引用 10 楼 AnYidan 的回复:右移int, 底层对应有两种汇编指令，逻辑右移和算术右移 #include <stdio.h> unsigned char ui;   signed char si; char main() {     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui>>1;     si=si>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed char)ui)>>1;     si=((unsigned char)si)>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("==============\n");      ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui<<1;     si=si<<1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed char)ui)<<1;     si=((unsigned char)si)<<1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      return 0; } //ui=128 //si=-128 //ui=64 //si=-64 //-------------- //ui=128 //si=-128 //ui=192 //si=64 //============== //ui=128 //si=-128 //ui=0 //si=0 //-------------- //ui=128 //si=-128 //ui=0 //si=0

/*unsigned char GetBit(int num,int bit) {     if(bit < 0 || bit > 31)         return -1;     else         return num>>bit&0x01; }*/ // 这个函数可以简单点的，或者都可以不用单独写个函数了！ int GetBit(int num, int pos) {     return (num & (1 << pos)); }

int不一定是32位

右移int, 底层对应有两种汇编指令，逻辑右移和算术右移

这是上次我去一个公司的一个笔试题，我写成了这样，勉强及格，我不知道问题出在什么地方？还有什么没有考虑吗？求高手指点。

仅供参考#include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des);     r = READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3

引用 5 楼 buyong 的回复:还有考虑int 的符号位 不管int的最高位是什么，总之移位之后都会放在最低位，然后和0x01求与，结果应该不会错吧。恕我愚昧，没明白你所说的是什么意思。

引用 3 楼 turingo 的回复:最好加括号：return (num>>bit)&0x01;  [quote=引用 楼主 Mr_warm 的回复:] #include <stdio.h> unsigned char GetBit(int num,int bit) {     if(bit < 0 || bit > 31)         return -1;     else         return num>>bit&0x01; }  int main(void) {     int num = 0x84218421;     int index = 32;     int i = 0;     for(i = 0; i < 32;)     {         printf("0x%x ",GetBit(num,i));         if((++i)%4 == 0)         {             putchar('\n');         }     }     getch();     return 0; } [/code]   求高手指点！[/quote] 嗯，这个以后注意。

引用 4 楼 bluebai123 的回复:注意，某一个bit的值，你这返回的是个uchar类型，是一个字节呀 它只表示0或者1，关键是c语言里没有表示bit这样的数据类型啊！

还有考虑int 的符号位

注意，某一个bit的值，你这返回的是个uchar类型，是一个字节呀

最好加括号：return (num>>bit)&0x01;  引用 楼主 Mr_warm 的回复:#include <stdio.h> unsigned char GetBit(int num,int bit) {     if(bit < 0 || bit > 31)         return -1;     else         return num>>bit&0x01; }  int main(void) {     int num = 0x84218421;     int index = 32;     int i = 0;     for(i = 0; i < 32;)     {         printf("0x%x ",GetBit(num,i));         if((++i)%4 == 0)         {             putchar('\n');         }     }     getch();     return 0; } [/code]   求高手指点！


Question: 谁来编一下这道c语言题，我会把错误的原因告诉你

仅供参考#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }

不就是一个求日期与2000年1月1日之间的天数么？ 先判断日期是否合法或小于2000年， 然后写个函数计算就可以了，还要有个闰年的判断函数

咦！~~  这LZ什么意思呢？  他是说我们一定会做错，还是说这个题就没有正确答案吗？ 关注下！~~~


Question: 帮忙看看

谢了啊，我明白了

其实已经写进去了，不过是二进制的，操作系统在读的时候，发现这不是可以打印的格式，所以会输出空格。 查看下文件的大小，就知道是否写入了。  如果你想写文本的话，用fprintf可以解决。  参考这里：http://stackoverflow.com/questions/4299877/fwrite-problem-cannot-write-in-binary-file

“什么都没有”取决于你怎么“看”。

引用 2 楼 u010396781 的回复:试过了，文件创建成功，文件里面什么也没有  检查下fwrite函数的返回值，看看，写是否成功了！

如何确认的没有，应该在函数退出后察看二进制格式的文件

你用二进制查看文件就清楚了。  引用 2 楼 u010396781 的回复:试过了，文件创建成功，文件里面什么也没有

FILE* fp = fopen("1.txt","wb");

写一个别的数试试,比如 int n=49;

试过了，文件创建成功，文件里面什么也没有

单步调试看看，是否创建文件就没有成功，或者是写进去了，你自己觉得是乱码而已。  引用 楼主 u010396781 的回复:#include <stdio.h>  int main() { 	FILE* fp = fopen("1.txt","w"); 	if(fp == NULL) 		return 0; 	int n=1;  	fwrite(&n,sizeof(n),1,fp); 	return 0; }  为什么写不进去啊


Question: 定义变量的位置不同导致结果出问题，搞不明白原因

谢谢你们的解答吖，明白了，如果放在外面的话，一旦里面置0就不能再置回1了

引用 2 楼 ns2250225 的回复:那我放外面不是假定他是素数吗？ 如果某个数是素数，那么这个flag就修改了，而且在下一次循环时没有得到重置。

另外一个通用的方法是，遇到迷糊的地方在纸上画画图帮助理解。  引用 2 楼 ns2250225 的回复:那我放外面不是假定他是素数吗？

遇到这种情况，就要调试了，快点学会调试可以节省很多时间

lz 理解 for 语句的执行顺序码？

这样说吧,你把flag放在里面每次重新进行循环的时候flag都会进行一次flag=1,的初始化. 如果你把flag放在外面,你自己看你的循环体计算过程,i先是等于2; 而J<I的时候是不进行循环的. 所以第一次循环,根据if(flag)判断出正确,所以先输出了2;第二次i是3;第一个判断if(i%j==0)不成立, 所以又输出了一个3;但是当i=4的时候,if(i%j==0)的判断正确了,当正确的时候你给flag付了新 的值,所以flag变成了0; 接下来无论怎么循环flag都是0了对吧. 因此if(flag){printf("%d",i)};是不是不再进行输出了, if(flag)这个判断是指flag等于1的时候,他才会执行,而你的flag经过第三次循环的时候 已经被改为了0.

注意是每个数，你放在外面那么只是对第一个数而言。  引用 2 楼 ns2250225 的回复:那我放外面不是假定他是素数吗？

第三次循环,i=4,j=2时,i%j==0,flag被清零,如果flag=1在外面,flag将永远是0 应该改成 for(i=2;i<=100;i++,flag=1)

那我放外面不是假定他是素数吗？

从逻辑上来讲就是要放在里面的，意思是对于每个数i，都要先假定它是素数flag=1。  引用 楼主 ns2250225 的回复:为什么int flag=1放在for外面就出错了，结果只显示2 3，而把int flag=1放在for里面又正常了，显示100内的素数   #include<stdio.h>    int main()    {         int i,j;        int flag=1;        for(i=2;i<=100;i++)            {                   for(j=2;j<i;j++)                    {                     if(i%j==0){flag=0;break;}                  }              if(flag) printf("%d ",i);           }      return 0;   }


Question: 这样的地址是否是连续的？

是。。。。。

目前动态分配的空间地址在逻辑上是连续的-方便管理，提高效率

举个例子，在Windows中，堆是通过他的堆管理器的HeapCreate创建的。而堆内的虚拟地址是通过VirtualAlloc申请的一大块虚拟地址空间。你在调用new/malloc的时候，实际上是间接调用Windows API函数HeapAlloc分配你需要大小虚拟地址空间，堆管理器有他自身的算法来保证连续地址的分配，而无论这段空间是从所创建的哪个堆分配出来的，都是连续的，当空间不足以分配你需要的大小时，HeapAlloc再次调用VirtualAlloc申请更大的虚拟地址空间。  由于虚拟地址空间与物理地址是一个映射关系，那么虚拟地址空间连续，物理地址空间不一定连续！应该说绝大多数时候都不可能是连续的。但是可以保证，new/malloc出的一段虚拟地址是连续的

不需要探究，这是王八的屁股-龟腚。  引用 5 楼 wangyaninglm 的回复:[quote=引用 3 楼 turingo 的回复:] 逻辑上是连续的，但是物理上不一定。   [quote=引用 楼主 wangyaninglm 的回复:]   m_pmatrix=new int[m_vexnum*m_vexnum];   不是new的地址是在堆上，是堆上一片的连续空间么？[/quote] 是不是应该向赵老师，学习输出一下这些所有元素的地址，深入探究一下。。。[/quote]

引用 3 楼 turingo 的回复:逻辑上是连续的，但是物理上不一定。   [quote=引用 楼主 wangyaninglm 的回复:]   m_pmatrix=new int[m_vexnum*m_vexnum];   不是new的地址是在堆上，是堆上一片的连续空间么？[/quote] 是不是应该向赵老师，学习输出一下这些所有元素的地址，深入探究一下。。。

逻辑上肯定是连续的

逻辑上是连续的，但是物理上不一定。   引用 楼主 wangyaninglm 的回复:  m_pmatrix=new int[m_vexnum*m_vexnum];   不是new的地址是在堆上，是堆上一片的连续空间么？

是连续的！ 支持通过地址移动来访问数据的！

一次性new的当然是连续的


Question: 怎么实现在局域网内两台电脑的聊天

局域网的话可以使用UDP组播，无需连接就可以进行通信

还是知道代码意思再说吧

改下ip吧，哈哈哈

注意IP，另外就算IP改好了注意防火墙。

这要看你自己局域网机器的IP啊  引用 3 楼 yuzengyuan 的回复:[quote=引用 2 楼 turingo 的回复:] 以下的IP地址要改： addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  [quote=引用 楼主 yuzengyuan 的回复:] 我是看孙鑫的VC++书的，里面有这样的聊天程序，在本地机子上开两个窗口是可以聊天的，但是局域网内一台机子开一个就不行。 这是服务器端的代码:  #include <Winsock2.h> #include <stdio.h>  void main() { 	WORD wVersionRequested; 	WSADATA wsaData; 	int err; 	 	wVersionRequested = MAKEWORD( 1, 1 ); 	 	err = WSAStartup( wVersionRequested, &wsaData ); 	if ( err != 0 )  	{ 		return; 	} 	  	if ( LOBYTE( wsaData.wVersion ) != 1 ||         HIBYTE( wsaData.wVersion ) != 1 )  	{ 		WSACleanup( ); 		return;  	} 	SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);  	SOCKADDR_IN addrSrv; 	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 	addrSrv.sin_family=AF_INET; 	addrSrv.sin_port=htons(6000);  	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  	char recvBuf[100]; 	char sendBuf[100]; 	char tempBuf[200];  	SOCKADDR_IN addrClient; 	int len=sizeof(SOCKADDR);  	while(1) 	{ 		recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); 		if('q'==recvBuf[0]) 		{ 			sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len); 			printf("Chat end!\n"); 			break; 		} 		sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf); 		printf("%s\n",tempBuf); 		printf("Please input data:\n"); 		gets(sendBuf); 		sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len); 	} 	closesocket(sockSrv); 	WSACleanup(); }  这是客户端的代码:  #include <Winsock2.h> #include <stdio.h>  void main() { 	WORD wVersionRequested; 	WSADATA wsaData; 	int err;   	wVersionRequested = MAKEWORD( 1, 1 ); 	 	err = WSAStartup( wVersionRequested, &wsaData ); 	if ( err != 0 )  	{ 		return; 	} 	  	if ( LOBYTE( wsaData.wVersion ) != 1 ||         HIBYTE( wsaData.wVersion ) != 1 ) 	{ 		WSACleanup( ); 		return;  	}    	SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);         	SOCKADDR_IN addrSrv; 	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 	addrSrv.sin_family=AF_INET; 	addrSrv.sin_port=htons(6000);  	char recvBuf[100]; 	char sendBuf[100]; 	char tempBuf[200];  	int len=sizeof(SOCKADDR);  	while(1) 	{ 		printf("Please input data:\n"); 		gets(sendBuf); 		sendto(sockClient,sendBuf,strlen(sendBuf)+1,0, 			(SOCKADDR*)&addrSrv,len); 		recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len); 		if('q'==recvBuf[0]) 		{ 			sendto(sockClient,"q",strlen("q")+1,0, 				(SOCKADDR*)&addrSrv,len); 			printf("Chat end!\n"); 			break; 		} 		sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf); 		printf("%s\n",tempBuf);  	} 	closesocket(sockClient); 	WSACleanup(); }  最好也帮我实现一下对内网和外网都可以聊天的[/quote] 怎么改[/quote]

引用 2 楼 turingo 的回复:以下的IP地址要改： addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  [quote=引用 楼主 yuzengyuan 的回复:] 我是看孙鑫的VC++书的，里面有这样的聊天程序，在本地机子上开两个窗口是可以聊天的，但是局域网内一台机子开一个就不行。 这是服务器端的代码:  #include <Winsock2.h> #include <stdio.h>  void main() { 	WORD wVersionRequested; 	WSADATA wsaData; 	int err; 	 	wVersionRequested = MAKEWORD( 1, 1 ); 	 	err = WSAStartup( wVersionRequested, &wsaData ); 	if ( err != 0 )  	{ 		return; 	} 	  	if ( LOBYTE( wsaData.wVersion ) != 1 ||         HIBYTE( wsaData.wVersion ) != 1 )  	{ 		WSACleanup( ); 		return;  	} 	SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);  	SOCKADDR_IN addrSrv; 	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 	addrSrv.sin_family=AF_INET; 	addrSrv.sin_port=htons(6000);  	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  	char recvBuf[100]; 	char sendBuf[100]; 	char tempBuf[200];  	SOCKADDR_IN addrClient; 	int len=sizeof(SOCKADDR);  	while(1) 	{ 		recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); 		if('q'==recvBuf[0]) 		{ 			sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len); 			printf("Chat end!\n"); 			break; 		} 		sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf); 		printf("%s\n",tempBuf); 		printf("Please input data:\n"); 		gets(sendBuf); 		sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len); 	} 	closesocket(sockSrv); 	WSACleanup(); }  这是客户端的代码:  #include <Winsock2.h> #include <stdio.h>  void main() { 	WORD wVersionRequested; 	WSADATA wsaData; 	int err;   	wVersionRequested = MAKEWORD( 1, 1 ); 	 	err = WSAStartup( wVersionRequested, &wsaData ); 	if ( err != 0 )  	{ 		return; 	} 	  	if ( LOBYTE( wsaData.wVersion ) != 1 ||         HIBYTE( wsaData.wVersion ) != 1 ) 	{ 		WSACleanup( ); 		return;  	}    	SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);         	SOCKADDR_IN addrSrv; 	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 	addrSrv.sin_family=AF_INET; 	addrSrv.sin_port=htons(6000);  	char recvBuf[100]; 	char sendBuf[100]; 	char tempBuf[200];  	int len=sizeof(SOCKADDR);  	while(1) 	{ 		printf("Please input data:\n"); 		gets(sendBuf); 		sendto(sockClient,sendBuf,strlen(sendBuf)+1,0, 			(SOCKADDR*)&addrSrv,len); 		recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len); 		if('q'==recvBuf[0]) 		{ 			sendto(sockClient,"q",strlen("q")+1,0, 				(SOCKADDR*)&addrSrv,len); 			printf("Chat end!\n"); 			break; 		} 		sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf); 		printf("%s\n",tempBuf);  	} 	closesocket(sockClient); 	WSACleanup(); }  最好也帮我实现一下对内网和外网都可以聊天的[/quote] 怎么改

以下的IP地址要改： addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  引用 楼主 yuzengyuan 的回复:我是看孙鑫的VC++书的，里面有这样的聊天程序，在本地机子上开两个窗口是可以聊天的，但是局域网内一台机子开一个就不行。 这是服务器端的代码:  #include <Winsock2.h> #include <stdio.h>  void main() { 	WORD wVersionRequested; 	WSADATA wsaData; 	int err; 	 	wVersionRequested = MAKEWORD( 1, 1 ); 	 	err = WSAStartup( wVersionRequested, &wsaData ); 	if ( err != 0 )  	{ 		return; 	} 	  	if ( LOBYTE( wsaData.wVersion ) != 1 ||         HIBYTE( wsaData.wVersion ) != 1 )  	{ 		WSACleanup( ); 		return;  	} 	SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);  	SOCKADDR_IN addrSrv; 	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 	addrSrv.sin_family=AF_INET; 	addrSrv.sin_port=htons(6000);  	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  	char recvBuf[100]; 	char sendBuf[100]; 	char tempBuf[200];  	SOCKADDR_IN addrClient; 	int len=sizeof(SOCKADDR);  	while(1) 	{ 		recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); 		if('q'==recvBuf[0]) 		{ 			sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len); 			printf("Chat end!\n"); 			break; 		} 		sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf); 		printf("%s\n",tempBuf); 		printf("Please input data:\n"); 		gets(sendBuf); 		sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len); 	} 	closesocket(sockSrv); 	WSACleanup(); }  这是客户端的代码:  #include <Winsock2.h> #include <stdio.h>  void main() { 	WORD wVersionRequested; 	WSADATA wsaData; 	int err;   	wVersionRequested = MAKEWORD( 1, 1 ); 	 	err = WSAStartup( wVersionRequested, &wsaData ); 	if ( err != 0 )  	{ 		return; 	} 	  	if ( LOBYTE( wsaData.wVersion ) != 1 ||         HIBYTE( wsaData.wVersion ) != 1 ) 	{ 		WSACleanup( ); 		return;  	}    	SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);         	SOCKADDR_IN addrSrv; 	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 	addrSrv.sin_family=AF_INET; 	addrSrv.sin_port=htons(6000);  	char recvBuf[100]; 	char sendBuf[100]; 	char tempBuf[200];  	int len=sizeof(SOCKADDR);  	while(1) 	{ 		printf("Please input data:\n"); 		gets(sendBuf); 		sendto(sockClient,sendBuf,strlen(sendBuf)+1,0, 			(SOCKADDR*)&addrSrv,len); 		recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len); 		if('q'==recvBuf[0]) 		{ 			sendto(sockClient,"q",strlen("q")+1,0, 				(SOCKADDR*)&addrSrv,len); 			printf("Chat end!\n"); 			break; 		} 		sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf); 		printf("%s\n",tempBuf);  	} 	closesocket(sockClient); 	WSACleanup(); }  最好也帮我实现一下对内网和外网都可以聊天的

简单的socket基本c/s！


Question: 有没有什么好的  算法案例书籍，推荐推荐

引用 2 楼 max_min_ 的回复:上面就有案例的！。。  版主   有没有 其他的，，我想看看 算法

引用 1 楼 wusuopuBUPT 的回复:推荐刘汝佳的《算法入门经典》，《算法艺术与信息学竞赛》（黑书），我们学校ACM培训用的书。 豆瓣链接：http://book.douban.com/tag/%E5%88%98%E6%B1%9D%E4%BD%B3  我想要的是  纯  案例的，，，这个是案例  多吗？

上面就有案例的！。。


Question: linux 平台下的一些开源项目

引用 6 楼 zhao4zhong1 的回复:《Linux C编程一站式学习》 赵老师这个回复很赞！！！

linux 下找不开源的才难好吧

开源网站找找。

《Linux C编程一站式学习》

其实Linux下的东西基本就是开源的。 httpd，postfix，named⋯⋯ 你把主要网络协议的服务器和客户端的代码都看看

学习linux网络编程一定要看的源代码   手动编写的一个HTTP协议的目录浏览和文件下载服务器： http://bbs3.chinaunix.net/viewthread.php?tid=892147&extra=page%3D1%26amp%3Bfilter%3Ddigest libevent的学习 http://www.wangafu.net/~nickm/libevent-book/ lighttpd-1.4.20源码分析分析 http://bbs3.chinaunix.net/viewthread.php?tid=1369986&extra=page%3D1%26amp%3Bfilter%3Ddigest  linux学习之路建议：http://bbs3.chinaunix.net/viewthread.php?tid=1070966&extra=page%3D1%26amp%3Bfilter%3Ddigest

Miro(http://www.getmiro.com/) is a popular, free, and open internet TV application.  引用 楼主 goldbeef 的回复:问下 linux平台下有什么比较经典的 开源小项目？   比如说代码量在 在10万行左右，偏网络编程，或IPC之类的， 不太注意GUI设计。

jQuery吧

楼主有兴趣一起研究axel吗？我这几天在看


Question: C程序 如何新建一个数据库？

可以这样，先弄一个模板，再简单地文件复制就行了

引用 1 楼 user-2 的回复:mdb是access建的文件,最好用它的接口进行访问.  如果你非要自己搞,也可以用c, 创建结构体(结构体按照mdb的格式进行设计),打开文件,写入结构体,关闭文件. 这种方式进行.  我用 ADO 操作的


Question: 菜鸡求教C语言素数环问题！！！！！

代码好长,你最好还是把它排版一下,用c格式.


Question: 矩阵转置问题！！

根本不需要什么辅助空间，根据d的取值直接用2维数组输出就可以了，一共就4种情况

把矩阵，看成直线族（一个矩形的各边和内部的点组成） ---实际是点族，坐标就是索引值 a00 的坐标是 （0，0）， 坐标旋转d度以后，求新的矩阵的大小 矩形旋转后，各边和坐标轴平行的矩形的，外接矩形的大小。 也就是原矩形顶点坐标，旋转后的最大最小坐标构成的新矩形的大小。 ----，和每个点的新坐标。可能要加偏移量（减去最小值）。  用新的大小，构造一个新的矩阵 在新矩阵中，每个点初始化为定值（比如 0，负无穷，或者正无穷） 然后把矩阵的每个数据放入对应的坐标位置，形成新的矩阵。

不知道更低复杂度的怎么搞，暂时只能想到O(N*N)空间和O(N*N)时间复杂度的方法了，N是矩阵的行数，对付这种规模的数据应该够用了： （1）旋转90度 =>  逐次将第i行，拷贝到第N-1-i列 （2）旋转180度 => 逐次将第i行，反向拷贝到第N-1-i行 （3）旋转270度 => 逐次将第i行，反向拷贝到第N-1-i列 （4）旋转360度<=> 旋转0度 （5）旋转d度  <=> 旋转(d/90 % 4)*90度

http://wenku.baidu.com/link?url=1a14RJdb1zmI59D5ILp8m1JMnK9O3cjBGdxCrbla74Hkrp98vrc3M9CFfVKZ-CC_u-YiAx8Tv2a4VCIWxuwSyL4YwWoXRomckrO8NWRo-AO 在其基础上考虑一下d,然后考虑空格

d是90的倍数，这干嘛用？


Question: 服务器是怎么实现几万甚至更多用户同时使用的？

引用 12 楼 houzhenghui123 的回复:[quote=引用 11 楼 xiaohuh421 的回复:] 一般都会用到分布式, 分担压力. 多服务器,多进程,多线程,多核 一台服务器不行就两台，两台不行三台，只要架构设计好，扩展性好，连接是无上限的[/quote]  该两位的建议不可取, 对于几万个在线用户,如果只是维护连接的话,肯定不需要多个服务器分布!!!

引用 11 楼 xiaohuh421 的回复:一般都会用到分布式, 分担压力. 多服务器,多进程,多线程,多核 一台服务器不行就两台，两台不行三台，只要架构设计好，扩展性好，连接是无上限的

一般都会用到分布式, 分担压力. 多服务器,多进程,多线程,多核

引用 1 楼 zapperstab 的回复:hash_map,key为fd,value为一个结构体，存放你所需的信息。效率不是问题  我觉得使用hash_map更好。red-black tree的计算量是O(logn)，但是hash_map平均为O(1)。当然前提是hash bucket有足够的大小。

引用 5 楼 xosion 的回复:[quote=引用 1 楼 zapperstab 的回复:] hash_map,key为fd,value为一个结构体，存放你所需的信息。效率不是问题 有什么库？还是自己定义struct value hashfunc(long key)这样的一个函数吗？[/quote] 我也不清楚，服务器端我一般用C++的，hash表不好写，但是楼上所说的红黑树是个好选择，C++ STL的map就是红黑树

引用 7 楼 xosion 的回复:[quote=引用 4 楼 truelance 的回复:] 效率不是问题,一般都是hash查找, 你不会认为是遍历吧 我以为是B树。。。。[/quote]  B树是适用于在硬盘上查找数据的数据结构, 如果被查找的数据能完全放在内存甚至cache中, B树不是好的选择, 甚至不如红黑树.

引用 4 楼 truelance 的回复:效率不是问题,一般都是hash查找, 你不会认为是遍历吧 我以为是B树。。。。

引用 2 楼 zhao4zhong1 的回复:参考apache相关源代码。 代码量太大了。。。。海里捞针啊

引用 1 楼 zapperstab 的回复:hash_map,key为fd,value为一个结构体，存放你所需的信息。效率不是问题 有什么库？还是自己定义struct value hashfunc(long key)这样的一个函数吗？

效率不是问题,一般都是hash查找, 你不会认为是遍历吧

一一映射一般用map（基于tree或者hash）

参考apache相关源代码。


Question: 我比较喜欢c语言，我希望大家能给我推荐一个编辑器，

你们推荐的都不错，谢谢大家

编辑器必须是SourceInsight

既然不错，为何不给分呢？  引用 8 楼 stackreader 的回复:你们推荐的都不错，谢谢大家

VS2008+VC助手，Windows上很方便 Linux上用VI Eclipse也有C++插件支持自动补全的

Code::Blocks(http://www.codeblocks.org/)，开源跨平台。  引用 楼主 stackreader 的回复:我现在用sublime，感觉没有一个全局的代码提示，就是比如说加载类库里面的方法进行只能提示这些的

vs,vc都蛮好的，如果你真的想学好C的话，用tc吧，他会给你养成良好的编程习惯的！

用qtCreator写C的我是一个人吗

谢谢各位，我是linux下的，

vs系列+插件


Question: 为什么我的代码编译不出a.out 文件，？也没有报编译错误，请大牛们给个明路

重点是要链接pthread库文件，另外main函数最好这样写： int main(int argc, char* argv[])  引用 6 楼 stackreader 的回复:[quote=引用 2 楼 turingo 的回复:] 需要链接pthread库文件，例如： g++ main.cpp -lpthread  [quote=引用 楼主 stackreader 的回复:] #include <stdio.h> #include <string.h> #include <pthread.h>  extern void *printMessage(void *msg);  int main(int argc, char const *argv[]) {  	pthread_t t1,t2; 	int p1,p2; 	char *msg1 = "this is thread one"; 	char *msg2 = "this is thread two"; 	p1 = pthread_create(&t1,NULL,printMessage,msg1); 	p2 = pthread_create(&t2,NULL,printMessage,msg2);  	pthread_join(t1,NULL); 	pthread_join(t2,NULL); 	char *msg = "this is a fuck test"; 	printf("%s\n", msg); 	return 0; }  void *printMessage(void *msg){  	char *message= (char*)msg; 	printf("%s\n", message);  return NULL; } [/quote]谢谢，我的是 .c文件，我之前也是那样编译的同步过，今天早上可以了  谢谢二位[/quote]

引用 5 楼 stackreader 的回复:[quote=引用 3 楼 user-2 的回复:]  //没有编译错误的话，不会没有a.out可执行文件吧  g++ -o main main.cpp -lphtread  //试试能不能生成main可执行文件谢谢，我的是 .c文件，我之前也是那样编译的同步过，今天早上可以了[/quote]  gcc -o main main.cpp -lphtread

引用 2 楼 turingo 的回复:需要链接pthread库文件，例如： g++ main.cpp -lpthread  [quote=引用 楼主 stackreader 的回复:] #include <stdio.h> #include <string.h> #include <pthread.h>  extern void *printMessage(void *msg);  int main(int argc, char const *argv[]) {  	pthread_t t1,t2; 	int p1,p2; 	char *msg1 = "this is thread one"; 	char *msg2 = "this is thread two"; 	p1 = pthread_create(&t1,NULL,printMessage,msg1); 	p2 = pthread_create(&t2,NULL,printMessage,msg2);  	pthread_join(t1,NULL); 	pthread_join(t2,NULL); 	char *msg = "this is a fuck test"; 	printf("%s\n", msg); 	return 0; }  void *printMessage(void *msg){  	char *message= (char*)msg; 	printf("%s\n", message);  return NULL; } [/quote]谢谢，我的是 .c文件，我之前也是那样编译的同步过，今天早上可以了  谢谢二位

引用 3 楼 user-2 的回复: //没有编译错误的话，不会没有a.out可执行文件吧  g++ -o main main.cpp -lphtread  //试试能不能生成main可执行文件谢谢，我的是 .c文件，我之前也是那样编译的同步过，今天早上可以了

需要链接pthread库文件，例如： g++ main.cpp -lpthread  引用 楼主 stackreader 的回复:#include <stdio.h> #include <string.h> #include <pthread.h>  extern void *printMessage(void *msg);  int main(int argc, char const *argv[]) {  	pthread_t t1,t2; 	int p1,p2; 	char *msg1 = "this is thread one"; 	char *msg2 = "this is thread two"; 	p1 = pthread_create(&t1,NULL,printMessage,msg1); 	p2 = pthread_create(&t2,NULL,printMessage,msg2);  	pthread_join(t1,NULL); 	pthread_join(t2,NULL); 	char *msg = "this is a fuck test"; 	printf("%s\n", msg); 	return 0; }  void *printMessage(void *msg){  	char *message= (char*)msg; 	printf("%s\n", message);  return NULL; }

自己顶一个先！！


Question: 关于select（）函数的问题

引用 1 楼 hnwyllmm 的回复:在Windows上，Select忽略第一个参数 Unix/Linux上，第一个参数写成sockfd + 1，系统从最小的描述符遍历到MAX  我也是这样理解的。。


Question: 控制台程序，如何实现按 ESC 键退出？

int ch; while(true) {    ch=getch();    if(27==ch)      break; }

不能用标准IO，要用控制台IO。

引用 1 楼 turingo 的回复: while(true) {     ch = getch();     if(ch == 27)  /* ESC */         break; }                     [quote=引用 楼主 u011642451 的回复:] 我有这么一个 思路：  while(true) {    if(ESC 键按下)      break; }  请给点代码提示吧，谢谢！[/quote]  非常感谢！

用cin.get()应该就可以了吧——我这个是C++的，C里面应该有类似的

1楼正解。。。

linux没有getch这个函数，只能使用getchar，可以这样使用，具体参考stty命令的用法      system ("/bin/stty raw");    int ch = getchar();     if(ch == 27)  /* ESC */         break;     system ("/bin/stty cooked");

引用 1 楼 turingo 的回复: while(true) {     ch = getch();     if(ch == 27)  /* ESC */         break; }    [quote=引用 楼主 u011642451 的回复:] 我有这么一个 思路：  while(true) {    if(ESC 键按下)      break; }  请给点代码提示吧，谢谢！[/quote]  不好意思，是我的疏忽，谢谢，我代码写错了，吧getch 写成了 getchar 所以搞错了  哎……熬夜后脑子到底是不行了……

getchar 和 getch 不一样的

上面写错了，不是getchar 是 getch

ESC 键，控制台程序根本就不响应这个键 我的程序如下：  int main() { 	int ch=0; 	while(true) 	{ 		if(kbhit()) 		{ 			ch = getchar(); 			if(27==ch) 				break; 		} 	} 	return 0; }  按ESC 键，根本就没有反应

引用 1 楼 turingo 的回复: while(true) {     ch = getch();     if(ch == 27)  /* ESC */         break; }   呵呵，我早试过了，不行

while(true) {     ch = getch();     if(ch == 27)  /* ESC */         break; }  引用 楼主 u011642451 的回复:我有这么一个 思路：  while(true) {    if(ESC 键按下)      break; }  请给点代码提示吧，谢谢！

//The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }


Question: 缓冲区读数据

继续顶啊！！！！！！！

引用 23 楼 u012889234 的回复:一直没有否认你的做法，，只是想换种方式。 去吧，相信总有一天你会换回来的。我等你。

一直没有否认你的做法，，只是想换种方式。

引用 21 楼 zhao4zhong1 的回复:struct _D {      short int2_0;      short int2_1;      char  int1_0;      int   int4_0;      char  int1_1;      unsigned char  str_0_len;//前面加unsigned使其取值范围0..255而不是-128..127      char  str_0[257]; } d[2];  有道理！！！！！

引用 14 楼 u012889234 的回复:struct _D {     short int2_0;     short int2_1;     char  int1_0;     int   int4_0;     char  int1_1;     char  str_0_len;     char  str_0[257]; } d[2];  我的意思是在处理数据部分的时候不使用结构体。。 char  str_0[257]这个字符的长度有char  str_0_len来决定。 你现在给了257固定大小，但实际可能就用了3个或7个字节的空间。 pbuf = (char *)pbuf + sizeof(UcHdr); 现在pbuf指针已经指向了buf中的数据开始的地方。。 用指针偏移的办法解析后面的每项数据。。。 这是我的疑问？、？？ 我用257是因为前面用一个字节（0x00～0xFF）表示后续字符串的长度最大可表示0～255个或1～256个，再加上字符串末尾的'\0'共257个。 鬼知道或鬼才关心你过去、现在和未来实际最长用几个字符啊。

顶！！我顶！！！！

c语言不就是这么吸引人的吗？

//使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }  个人倾向不使用动态分配。

引用 15 楼 u012889234 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] [quote=引用 8 楼 u012889234 的回复:] 我之前也是用结构体来解析数据部分的，但用户名和密码不是定长，现在固定了大小，肯定会有问题。可能还会有其他的变长数据，所以6楼的解答虽然不错，，但还不是我想要的结果。。。 大家再接再励。。。。。 你要知道这个世界上古往今来从来就没有实际存在过哪怕一例不限制最大长度的不定长字符串。 [/quote] 但考虑到内存，，你这显然会浪费啊！[/quote] 人为什么要长阑尾？

引用 13 楼 zhao4zhong1 的回复:[quote=引用 8 楼 u012889234 的回复:] 我之前也是用结构体来解析数据部分的，但用户名和密码不是定长，现在固定了大小，肯定会有问题。可能还会有其他的变长数据，所以6楼的解答虽然不错，，但还不是我想要的结果。。。 大家再接再励。。。。。 你要知道这个世界上古往今来从来就没有实际存在过哪怕一例不限制最大长度的不定长字符串。 [/quote] 但考虑到内存，，你这显然会浪费啊！

引用 8 楼 u012889234 的回复:我之前也是用结构体来解析数据部分的，但用户名和密码不是定长，现在固定了大小，肯定会有问题。可能还会有其他的变长数据，所以6楼的解答虽然不错，，但还不是我想要的结果。。。 大家再接再励。。。。。 你要知道这个世界上古往今来从来就没有实际存在过哪怕一例不限制最大长度的不定长字符串。

string是对象，不是一段内存，不适合放在struct中。

//ver:1 //resv1:0 //signature:CUC //type:69 //no:5 //resv2:0 //seq:4 //length:56 //int2,1 //int2,2 //int1,1 //int4,30 //int1,1 //int1,7 //str,beijing //int2,1 //int2,4 //int1,1 //int4,60 //int1,1 //int1,7 //str,tianjin //int4,80 //二进制文件b.bin是: //00000000h: 01 43 55 43 45 00 05 00 00 00 00 04 00 00 00 38 //00000010h: 00 01 00 02 01 00 00 00 1E 01 07 62 65 69 6A 69 //00000020h: 6E 67 00 01 00 04 01 00 00 00 3C 01 07 74 69 61 //00000030h: 6E 6A 69 6E 00 00 00 50 #pragma comment(lib,"ws2_32") #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #pragma pack(push,1) struct _H {     char  ver; //  char  resv1;     char  signature[3];     char  type;     short no;     char  resv2;     int   seq;     int   length; } h; struct _D {     short int2_0;     short int2_1;     char  int1_0;     int   int4_0;     char  int1_1;     char  str_0_len;     char  str_0[257]; } d[2]; int   t,i,n; #pragma pack(pop) FILE *f; int main() {     f=fopen("b.bin","rb");     if (NULL==f) {         printf("Can not open file b.bin!\n");         return 1;     }     fread(&h,sizeof(struct _H),1,f);     i=0;     while (1) {         if (1!=fread(&d[i],sizeof(struct _D)-257,1,f)) break;         fread(d[i].str_0,d[i].str_0_len,1,f);         d[i].str_0[d[i].str_0_len]=0;         i++;         if (i>=2) break;     }     n=i;     fread(&t,sizeof(int),1,f);     fclose(f);     printf("ver:%d\n"        ,h.ver);     printf("resv1:0\n");     printf("signature:%.3s\n",h.signature);     printf("type:%d\n"       ,h.type);     printf("no:%hd\n"        ,ntohs(h.no));     printf("resv2:%d\n"      ,h.resv2);     printf("seq:%d\n"        ,ntohl(h.seq));     printf("length:%d\n"     ,ntohl(h.length));     for (i=0;i<n;i++) {         printf("%d int2_0:%hd\n"  ,i,ntohs(d[i].int2_0));         printf("%d int2_1:%hd\n"  ,i,ntohs(d[i].int2_1));         printf("%d int1_0:%d\n"   ,i,d[i].int1_0);         printf("%d int4_0:%d\n"   ,i,ntohl(d[i].int4_0));         printf("%d int1_1:%d\n"   ,i,d[i].int1_1);         printf("%d str_0_len:%d\n",i,d[i].str_0_len);         printf("%d str_0:%s\n"    ,i,d[i].str_0);     }     printf("t:%d\n"     ,ntohl(t));     return 0; } //ver:1 //resv1:0 //signature:CUC //type:69 //no:5 //resv2:0 //seq:4 //length:56 //0 int2_0:1 //0 int2_1:2 //0 int1_0:1 //0 int4_0:30 //0 int1_1:1 //0 str_0_len:7 //0 str_0:beijing //1 int2_0:1 //1 int2_1:4 //1 int1_0:1 //1 int4_0:60 //1 int1_1:1 //1 str_0_len:7 //1 str_0:tianjin //t:80 //

效率低不低取决于你的协议，局部来说你也可以一次取出几K，分析完了再读取几K这样来提升效率。  引用 2 楼 u012889234 的回复:[quote=引用 1 楼 turingo 的回复:] 用fgetc一个字节一个字节的分析处理。   好像不行哦！！！！！貌似这效率也蛮低的。[/quote]

引用 1 楼 turingo 的回复:用fgetc一个字节一个字节的分析处理。   好像不行哦！！！！！貌似这效率也蛮低的。

用fgetc一个字节一个字节的分析处理。

引用 4 楼 qq120848369 的回复:很简单啊，准备一个std::string，然后parse发现数据不够就再读一些进来啊，parse完了erase掉继续啊。  c语言


Question: setjmp和信号的结合

signal函数，内部和setjmp，longjmp的实现，有一定的关系。 处理不好，会有冲突。

两种异常处理机制不相容 跟 两种防火墙杀毒软件不相容 类似。

当 setjmp 和 longjmp 是一起使用时，它们提供一种方法来执行非本地 goto. 它们通常用来传递给错误处理或恢复以前被调用例程中的代码的执行控制，而无需使用标准的调用或返回约定。 警告说明警告  但是，因为setjmp和 longjmp不支持 c + + 对象语义，并且因为它们可能会降低性能，防止对局部变量的优化，我们建议您不要使用它们在 c + + 程序中。 我们建议使用 try/ catch改为构造。  如果您决定使用 setjmp/ longjmp在 c + + 程序中，还包括 SETJMP。H 或 SETJMPEX。H 以确保正确 c + + 异常处理的函数之间的互动。 如果您使用 /EH 进行编译，本地对象的析构函数调用堆栈展开过程。 如果您使用/EHs编译，以及您的函数调用的函数，它使用一个 nothrow 并使用函数nothrow调用 longjmp，然后析构函数展开可能不会发生，具体取决于优化程序。  在可移植代码中，当非本地goto调用 longjmp执行时，正确销毁的基于帧的对象可能不可靠。   http://technet.microsoft.com/zh-cn/interopmigration/yz2ez4as


Question: 有关c语言图像处理的图片大小的问题

引用 5 楼 turingo 的回复:直接写入图片文件名调试看看。  引用 4 楼 jinmengjue1989 的回复:引用 3 楼 turingo 的回复:只有单步调试看看。我的ROW 和COL改了编译时没有错的，只是不出来Input the path of the BMP file:没法输入路径，而是出来Press any key to continue,这是为什么啊？直接写是可以的，但是写路径这样就是不行了，把ROW和COL改成比240和320小的就运行正常，要是改大了，就是不行，按理说这就是定义了数组的大小啊？为什么不可以呢？

看楼主的意思，printf("Input the path of the BMP file:\n");   这个没有打出来。可能是楼主本地编译器对堆栈大小有限制。 a[ROW][COL]这个栈数据过大超出编译器的允许最大限制程序加载不起来。 试试改改编译器的设置

参考MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\MANDEL\*.*

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

main()里面有个魔数 190  把这个190 的来历搞清楚，也许就解决了。

我用楼主的代码在我的电脑上编了一下，没有楼主所说的现象啊

引用 8 楼 lm_whales 的回复:320 是 32 的整数倍，任何因为“位图数据对齐，而产生的问题”，都不存在；  解决这个问题的方案，就是修改 “位图数据对齐，没有正确处理”的错误； 使得任何宽度的位图，都不会有对齐错位的问题。但是我改成其他的32的倍数也是不行的啊？比如：480*640，这是为什么啊？求指点！

只有单步调试看看。

自己顶，求高手指点下！！

bmp.h是： /*BMP.h*/   #ifndef BMP_H_INCLUDED   #define BMP_H_INCLUDED      typedef unsigned short WORD;   typedef unsigned long DWORD;   typedef long LONG;   typedef unsigned char BYTE;      typedef struct tagBITMAPFILEHEADER   {       WORD bfType;       DWORD bfSize;       WORD bfReserved1;       WORD bfReserved2;       DWORD bfOffBits;   }BITMAPFILEHEADER;      typedef struct tagBITMAPINFOHEADER   {       DWORD biSize;       LONG biWidth;       LONG biHeight;       WORD biPlanes;       WORD biBitCount;       DWORD biCompression;       DWORD biSizeImage;       LONG biXPelsPerMeter;       LONG biYPelsPerMeter;       DWORD biClrUsed;       DWORD biClrImportant;   }BITMAPINFOHEADER;      typedef struct tagRGBQUAD   {       BYTE rgbBlue;       BYTE rgbGreen;       BYTE rgbRed;       BYTE rgbReserved;   }RGBQUAD;      typedef struct tagBITMAPINFO   {       BITMAPINFOHEADER bmiHeader;       RGBQUAD bmiColors[1];   }BITMAPINFO;      #endif


Question: 输入输出问题

还是不成啊，怎么弄

#include <stdio.h> #include <stdlib.h> typedef struct node { char word; int weight; struct node *left,*right; }HUFFNODE;  int main(void) { HUFFNODE *root,*p; HUFFNODE **F; int i,n,w; char c; printf("请输入叶子个数："); scanf("%d",&n); F=(HUFFNODE **)malloc(n*sizeof(HUFFNODE *)); printf("请输入叶子信息：\n"); for(i=0;i<n;i++) { p=(HUFFNODE *)malloc(sizeof(HUFFNODE)); printf("请输入第%d个叶子的字符",i+1); scanf("%c\n",&c); printf("请输入第%d个叶子的权值",i+1); scanf("%d\n",&w); p->word=c; p->weight=w; p->left =NULL; p->right =NULL; F[i]=p; }     return 0; }  引用 楼主 u010013126 的回复:#include <stdio.h> #include <stdlib.h> typedef struct node { 	char word; 	int weight; 	struct node *left,*right; }HUFFNODE;  int main(void) { 	HUFFNODE *root,*p; 	HUFFNODE **F; 	int i,n,w; 	char c; 	printf("请输入叶子个数："); 		scanf("%d",&n); 	F=(HUFFNODE **)malloc(n*sizeof(HUFFNODE *)); 	printf("请输入叶子信息：\n"); 	for(i=0;i<n;i++) 	{ 		p=(HUFFNODE *)malloc(sizeof(HUFFNODE)); 		printf("请输入第%d个叶子的字符",i+1); 		scanf("%c",&c); 		printf("请输入第%d个叶子的权值",i+1); 		scanf("%d",&w); 		p->word=c; 		p->weight=w; 		p->left =NULL; 		p->right =NULL; 		F[i]=p; 	}     return 0; } 这个输入输出有问题，为何不行，帮我解决一下

在输入一个后就不成了，程序运行不成啊

什么问题？  建议： 1 检查 scanf返回值！确认每次输入的数的类型是匹配的        2 处理下每次输入的回车符的干扰！


Question: c语言，如何在输入的字符串中找到中文字符？

中文是两个字节，需要这样配套查找：  while(*str) { 	/** 中文字符，每次加两个字节 */ 	if(*str & 0x80) 	{ 		str++; 		str++; 	} 	/** 英文字符，每次加一个字节 */ 	else 	{ 		str++; 	} }  引用 楼主 u013022580 的回复:如题。 我查到可以通过if(b[0]>0x80)判断，结果发现行不通。。。 谢谢啦~


Question: 函数的参数列表里为啥不能用常量？

忘记说了，const可以直接转为non-const，前提是发生拷贝，也就是值传递。

non-const可以自动转为const，但const不能直接转为non-const

在作为参数时, 数组和指针是等价的. 所以你在函数里修改了值, 函数外的值也会发生变化.

void add(int data[], int addend[], int* result); 函数定义是 int data[] 参数是const int data[] 类型都不一样啊 不知道你怎么能够编译通过的啊

传入的是数组的地址，当然不能修改data中的内容，而且你的函数设计和调用明显矛盾，明明是常量数据为何又要去修改它，真是匪夷所思！  引用 楼主 u012931864 的回复:定义了一个函数是这样的： void add(int data[], int addend[], int* result); 引用是这样的: const int data[]={1,2,3,4,5,6},addend[]={6,5,4,3,2,1}; ..... int main(void) {    ...   add(data,addend,result);   ... } 函数的具体实现里对data和addend里元素的值做了改变，可是这与外面的data和addend数组无关啊～


Question: C语言如何从特殊的地方截取字符串

引用 1 楼 turingo 的回复: #include <string.h> #include <stdio.h>  int main() { 	char text[] = "VL04a+80ms+VL04b+10ms+VL04c"; 	char* d = "+"; 	char* p = strtok(text, d); 	while(p != NULL) 	{ 		printf("%s\n", p); 		p = strtok(NULL, d); 	}  	return 0; }   这 无疑是用strtok函数最为方便了！

#include <string.h> #include <stdio.h>  char string[] = "VL04a+80ms+VL04b+10ms+VL04c"; char seps[]   = "+"; char *token;  void main( void ) { 	printf( "%s\n\nTokens:\n", string ); 	/* Establish string and get the first token: */ 	token = strtok( string, seps ); 	while( token != NULL ) 	{ 		/* While there are tokens in "string" */ 		printf( " %s\n", token ); 		/* Get next token: */ 		token = strtok( NULL, seps ); 	} }

#include <string.h> #include <stdio.h>  int main() { 	char text[] = "VL04a+80ms+VL04b+10ms+VL04c"; 	char* d = "+"; 	char* p = strtok(text, d); 	while(p != NULL) 	{ 		printf("%s\n", p); 		p = strtok(NULL, d); 	}  	return 0; }  引用 楼主 tanqiyingk 的回复:例如：    有字符串：'VL04a+80ms+VL04b+10ms+VL04c'  我需要将字符串从有加号的地方截开变成5个字符串 那么5个字符串分别是： 'VL04a' '80ms' 'VL04b' '10ms' 'VL04c' 请懂的朋友解答下，谢谢！！


Question: c语言求指教

#include<stdio.h> #include<stdlib.h>  int i,flag,max,j,k,t[257]; char c,s[257]; int main(){     scanf("%c",&c);     max=1;     while(c!='?'){         flag=0;         for (i=1;i<=max;i++)             if(s[i]==c){                 t[i]++;                 flag=1;                 break;             }         if (flag==0){             max++;             s[max]=c;             t[max]=1;         }         scanf("%c",&c);     }     for (i=1;i<max;i++)         for(j=i+1;j<=max;j++)             if (t[i]<t[j]){                 k=t[i];                 t[i]=t[j];                 t[j]=k;                 c=s[i];                 s[i]=s[j];                 s[j]=c;             }     for(i=1;i<=max;i++)         printf("%c:%d\n",s[i],t[i]);     return 0; }  引用 楼主 u012427887 的回复:、输入一个字符串，以‘？’结束，统计各字母出现的次数，并按字母出现的多少输出（先输出字母出现多的，次数相同的按字母表顺序输出，不出现的字母不输出）。

比较简单的出题目！ 可以自己先动手写写！


Question: 编写好了一个c程序，想给做个界面，可以输入输出的那种！有没有什么简单的方法啊？简单的界面就可以了！

引用 8 楼 BlackKOL 的回复:引用 7 楼 max_min_ 的回复:[quote=引用 4 楼 jinmengjue1989 的回复:] [quote=引用 2 楼 user-5 的回复:] 可以考虑使用MFC创建一个基于对话框的小程序。有没有什么简单的方法啊？感觉MFC上手太慢了，也不知道应该把这个程序放在哪个类下面，因为急着用，没有时间了！ 学Qt去吧！不要搞MFC了！[/quote]  掏钱让人写吧, 还搞什么自己开发[/quote]这不是不会才学呢么，至于说话这么难听不啊！

引用 7 楼 max_min_ 的回复:引用 4 楼 jinmengjue1989 的回复:[quote=引用 2 楼 user-5 的回复:] 可以考虑使用MFC创建一个基于对话框的小程序。有没有什么简单的方法啊？感觉MFC上手太慢了，也不知道应该把这个程序放在哪个类下面，因为急着用，没有时间了！ 学Qt去吧！不要搞MFC了！[/quote]  掏钱让人写吧, 还搞什么自己开发

引用 4 楼 jinmengjue1989 的回复:引用 2 楼 user-5 的回复:可以考虑使用MFC创建一个基于对话框的小程序。有没有什么简单的方法啊？感觉MFC上手太慢了，也不知道应该把这个程序放在哪个类下面，因为急着用，没有时间了！ 学Qt去吧！不要搞MFC了！

就命令行吧。 你可以让用户输入目录路径，然后便利目录

如果是我，用VB6弄个窗口界面，用Shell函数调用C生成的exe。 用文本文件在VB6和C之间传递信息。  不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

可以考虑使用MFC创建一个基于对话框的小程序。

自己顶下，求高手指点！！


Question: Linux下执行程序后生成的文件，用cat打开正常，用emeditor打开就是会出现一些乱码

编译不一致造成的吧！而且只是我们看到乱码而已！

可能是cat的时候是UTF-8的编码，而emeditor编辑的时候是另外一种编码。  引用 楼主 bobbyzhu9505 的回复:cat文件，显示的是： spawn su root: パスワード: [root@{HOST_NAME} {FOLDER_NAME}]# sh FT__SWITCH_001_037_SUB2.sh [root@{HOST_NAME} {FOLDER_NAME}]# exit exit  emeditor打开，显示的是： spawn su root パスワード: ]0;cob@localhost:{FTTP_WORKDIR}/cobolsrc/cobol_lnx_v1/Win-Linux/max_path[?1034h[root@{HOST_NAME} {FOLDER_NAME}]# sh FT__SWITCH_001_037_SUB1.sh ]0;cob@localhost:{FTTP_WORKDIR}/cobolsrc/cobol_lnx_v1/Win-Linux/max_path[root@{HOST_NAME} {FOLDER_NAME}]# exit exit  上面红色的就是不应该有的，哪位大神帮忙看看啊

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。


Question: 关于通信中select的问题

引用 5 楼 shijie_nanjing 的回复:[quote=引用 3 楼 max_min_ 的回复:] 一直阻塞阿！轮询检测文件描述符是否可读，可写或者异常！ 还是不太懂，能不能详细解释下可读可写变化？ [/quote] lz看过《unix网络编程》吗？里面有很详细的介绍，或者google一下也可以 概况的说一下，套接字满足以下任一条件可读： 1.普通意义上的可读，即接收区字节数大于等于其低水位标记 2.读半部关闭，即对方发了一个FIN分节过来，套接字可读但是读操作返回0 3.监听套接字且连接不为0 4.该socket上有错误，读操作返回-1  以上四点都可以让select返回

引用 8 楼 shijie_nanjing 的回复:[quote=引用 6 楼 max_min_ 的回复:] [quote=引用 5 楼 shijie_nanjing 的回复:] [quote=引用 3 楼 max_min_ 的回复:] 一直阻塞阿！轮询检测文件描述符是否可读，可写或者异常！ 还是不太懂，能不能详细解释下可读可写变化？ [/quote] google下select函数的基本用法！[/quote] google我都查过了，还是不太懂。换句话问，我就想知道什么时候有返回值？什么时候一直死等？可读可写是指的文件描述符的一种设定，还是说有数据需要读写？[/quote] 轮询的是第一个传起来的socket的访问，有可读的数据了，或者准备好的写数据，或者捕获到的异常，就返回了！

引用 6 楼 max_min_ 的回复:[quote=引用 5 楼 shijie_nanjing 的回复:] [quote=引用 3 楼 max_min_ 的回复:] 一直阻塞阿！轮询检测文件描述符是否可读，可写或者异常！ 还是不太懂，能不能详细解释下可读可写变化？ [/quote] google下select函数的基本用法！[/quote] google我都查过了，还是不太懂。换句话问，我就想知道什么时候有返回值？什么时候一直死等？可读可写是指的文件描述符的一种设定，还是说有数据需要读写？

我的理解是获取了IO

引用 5 楼 shijie_nanjing 的回复:[quote=引用 3 楼 max_min_ 的回复:] 一直阻塞阿！轮询检测文件描述符是否可读，可写或者异常！ 还是不太懂，能不能详细解释下可读可写变化？ [/quote] google下select函数的基本用法！

引用 3 楼 max_min_ 的回复:一直阻塞阿！轮询检测文件描述符是否可读，可写或者异常！ 还是不太懂，能不能详细解释下可读可写变化？

引用 3 楼 max_min_ 的回复:一直阻塞阿！轮询检测文件描述符是否可读，可写或者异常！  可读，可写是指socket的设定，还是说socket有接续侧，有数据可以读取？ socket有个shutdown方法，可以关闭读写，shutdown的时候会触发select吗？

一直阻塞阿！轮询检测文件描述符是否可读，可写或者异常！

不是变化，是文件描述符对应的socket可读或者可写。

顶。。。。。。。。。。。


Question: 新手求教书上的题目 小写的a根据附录A中的ASCII表找出对应的数值 97对应的是a（a上面有2点上面）

引用 2 楼 nice_cxf 的回复:a 十进制 102 十六进制61 A 十进制 62 十六进制41 9 十进制 54 十六进制39 ...... 这什么破书啊，0x61=97,0x41=65,0x39=57 顶啊。楼主自己都没算一下十进制和十六进制的结果能不能对上吗？

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

你在自己电脑上测试一下就知道是谁错了

printf("%d",'a');//用这个打印出来时多少就是多少


Question: TC2.0 下定时器使用  DOS

在DoxBox下运行

/***NOTE:     This is an interrupt service routine.  You can NOT compile this     program with Test Stack Overflow turned on and get an executable     file which will operate correctly. */  #include <stdio.h> #include <dos.h> #include <conio.h>  #define INTR 0X1C    /* The clock tick interrupt */  #ifdef __cplusplus     #define __CPPARGS ... #else     #define __CPPARGS #endif  void interrupt ( *oldhandler)(__CPPARGS);  int count=0;  void interrupt handler(__CPPARGS) { /* increase the global counter */    count++;  /* call the old routine */    oldhandler(); }  int main(void) { /* save the old interrupt vector */    oldhandler = getvect(INTR);  /* install the new interrupt handler */    setvect(INTR, handler);  /* loop until the counter exceeds 20 */    while (count < 20)       printf("count is %d\n",count);  /* reset the old interrupt handler */    setvect(INTR, oldhandler);     return 0; }


Question: 有点不懂这个小代码

C/C++默认都是从右向左求值运算的，至于值为什么不同，是编译器实现不同，这种非正常的写法，标准没有规定，是未定义的

我是来水钱的！！

蛋疼的编码方式。

同意2楼所言。一个语句里最多一个++操作。

入栈顺序不同，结果不同~

有些傻逼公司或者学校的考试就喜欢这种问题，似乎显得自己多么牛B，其实这种问题毫无研究价值。不同的编译器的实现不一定相同。当你以为在VC6.0下理解了他的含义，然后惊人的发现原来在VS2008下答案不是这样的。。。瞬间心理防线彻底被摧毁！！！  不要在同一句代码当中操作同一个变量！！!

引用 2 楼 KANDANKK 的回复:引用 1 楼 sundq12 的回复:不要研究这种代码，会把你带到坑里去的。为什么？ 这种代码的结果取决于编译器读取函数参数时是从左至右还是从右至左，严重降低了代码的移植性。只有蛋疼的人才会人为创造不爽。  类似的这种蛋疼的代码分为两种： 1. 上述不可移植性的，属于垃圾代码； 2. 有固定的执行方式，但人看的时候要去查C语言优先级的，降低了代码易读性，不推荐。但这种东西面试什么的特别喜欢倒腾。

printf中是从最右边i++开始计算的，至于值为什么是那样的，这个要了解编译器的编译机制

怎么还这么多人纠结这个。 ++i;先加，再运算 i++;先运算，再加 知道就这个道理就行了。  强烈鄙视那些，以这些东西面试的面试官...

不折腾！折腾误国误民！！

看置顶贴吧，里面说的很详细，主要是顺序点的确定决定的

不同编译器，不同环境结果不同，我这里是7,7,7

别说不同编译器 ，就是相同编译器，不同编码选项，都会有不同的结果，比如debug和release.

看置顶贴吧，这是未定义行为。这种自己都不能说出执行顺序的语句不要写。 这种语句，不同的编译器，有不同的解释，执行结果是不一样的，你没必要研究这个。

引用 2 楼 KANDANKK 的回复:引用 1 楼 sundq12 的回复:不要研究这种代码，会把你带到坑里去的。为什么？没有意义。

参考http://bbs.csdn.net/topics/370153775  引用 楼主 KANDANKK 的回复:#include<stdio.h> void main() {int i=7; printf("%d\n%d\n%d\n",++i,--i,i++); } 为什么是7,6,7，而不是7,6,8？

不要研究这种代码，会把你带到坑里去的。


Question: 如何发帖---给新手们

善待每一个热心帮助的人，即使没有帮你解决当下问题！

尽量先自己调试，如果调试过仍无法解决可以google。如果已google，先注明我已google过，但没有找到合适的答案。  详情见，C++版置顶贴：提问的智慧

如果是语法问题，最好自己看书或 google

发帖前自己先仔细想想，动手做做


Question: 关于 offset address 的问题，求解大神

引用 10 楼 zhao4zhong1 的回复:如果a的地址是0x00001000,那么偏移四个字节地址是0x00001004 如果b的地址是0x00001004,那么偏移一个字节地址是0x00001005还是胸章多的牛，那个版主回答的太不认真了

引用 楼主 u011959714 的回复:int a=0; char b=0; 如果a的地址是0x00001000,那么偏移一步（四个字节）地址是多少（0x00001100吗）；偏移一位（8个二进制位），地址是多少（0x00001001吗）  如果b的地址是0x00002000,那么偏移一步（一个字节）地址是多少（0x00001008吗）；偏移一位（8个二进制位），地址是多少（0x00001001吗） 楼主，这0x是16进制的前缀啊。0x1100-0x1000=0x100=256. 另外内存里面貌似是没有按位偏移的。想玩按位取值的话，只有基于byte的运算了。

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

地址对应的最小单位应该是字节

引用 1 楼 worldy 的回复:int +4 char +1这个知道，我问的是地址的值，编译器测不出来

int +4 char +1

地址的最小单位是 byte, 位是没有所谓地址的，只能对位所在的变量求 &

高手

没人吗 ？在线等

引用 2 楼 u011959714 的回复:[quote=引用 1 楼 worldy 的回复:] int +4 char +1这个知道，我问的是地址的值，编译器测不出来[/quote]用编译器断电调试，然后watch变量即可看到。


Question: 数据结构c语言。函数问题

代码的容错性，健壮性， 不是靠语言自身，或者库函数实现的； 而是靠程序员自己实现的。  你的程序，自己没有考虑容错性，健壮性。 问题当然要自己解决。

咦？我怎么又来了！

while (!feof(fp)) 如果文件为空的话，由于这个条件应该不会开始循环吧？那么最后返回的应该是一个空的head指针啊。

不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。  另外请检查fscanf函数的返回值！

q=(Vlist)malloc(sizeof(V)); memset(q, 0 , sizeof(V));

q=(Vlist)malloc(sizeof(V));//在分配内存之后，使用bzero初始化分配的内存，就不会为有乱码了

顺序读肯定是要读到出错为止，最后一个节点删除不就得了...

q=(Vlist)calloc(sizeof(V));

二楼，这个不能用啊……


Question: 求改正！

引用 5 楼 u012848622 的回复:这是题目要; 编写用指针变量作为函数参数实现两个数的交换的函数，主函数输入两个个数都为10的数组A，B，调用所编写的函数交换数组A，B中对应元素的值。  #include<stdio.h>  void swap(int a[],int b[]); int main() { 	int i; 	int a[10],b[10]; 	int *p; 	int *q; 	p=a; 	q=b; 	printf("please enter 10 score to a[]"); 	for(i=0;i<10;i++) 	{ 		scanf("%d",&a[i]); 		getchar(); 	}	 	printf("please enter 10 score to b[]"); 	for(i=0;i<10;i++) 	{ 		scanf("%d",&b[i]); 		getchar(); 	} 	swap(a ,b); 	for(i=0;i<10;i++) 	{ 		printf("%d",a[i]); 	} 	printf("\n"); 	for(i=0;i<10;i++) 	{ 		printf("%d",b[i]); 	} }  void swap(int a[], int b[]) { 	int i,temp; 	for(i=0; i < 10; i++) 	{ 		temp = a[i]; 		a[i] = b[i]; 		b[i] = temp; 	}  }

swap(int a[10],int b[10]); ==> for(int i=0;i<10;i++) swap(a[i],b[i];  swap(int a[],int b[]) { int temp; temp=*p; *p=*q; *q=temp; }  ==> swap(int* a,int *b) { int temp; temp=*a; *a=*b; *b=temp; }

你能不能认真一点，都不知道你要问什么，还有你能不能把代码格式化一下呀，这样的贴有人回答就怪了。

swap(int a[10],int b[10]);想交换最后两个元素请用 a[9],b[9]; 想交换两个数组中的所有元素请改写交换函数，使用正确的指针调用方式 ----------------------------------------------------------------- 发帖请先注明自己的意图，有问题的地方

引用 3 楼 Adol1111 的回复:好多问题，不能直视啊！#include<stdio.h>  void swap(int* p,int *q);//前置声明  int main(){//K&R风格的太老了吧，建议改成这种，还有{忘了写了 	int i; 	int a[10],b[10]; 	int *p; 	int *q; 	p=a; 	q=b; 	printf("please enter 10 score to a[]"); 	for(i=0;i<10;i++) 	{ 		scanf("%d",&a[i]); 	} 	printf("please enter 10 score to b[]"); 	for(i=0;i<10;i++) 	{ 		scanf("%d",&b[i]); 	} 	swap(a,b);//传递数组，只要数组名就可以了，你那个传递的是a[10]的值，不是一串数组               //a[10]还超过最大上限了，溢出了 	for(i=0;i<10;i++) 	{ 		printf("%d",a[i]); 	} 	printf("\n"); 	for(i=0;i<10;i++) 	{ 		printf("%d",b[i]); 	} 	return 0; } void swap(int* p,int *q)//你定义的是a,b，哪里来的p、q { 	int temp; 	for(int i=0;i<10;i++,p++,q++){//你那个只能交换a[0]和b[0]，但不能交换整个数组 		temp=*p; 		*p=*q; 		*q=temp; 	} } +1


Question: 菜鸟自学C编的一个程序，但是一运行就提示停止工作，望大神指导！

for(i=0;i<n;i++)         {p=BT;         for(j=1;j<dpth;j++)         {             if(p->state)              { p->state=0;                p=p->rtree;}              else              {                  p->state=1;                  p=p->rtree;                  }             }         printf("%d",p->data); n输入是做什么用的？另外无论节点状态如何，都是往右面节点走，逻辑出错了吧？

for(i=2;i<=m-1;i++)     {         p=NULL;         p=(tlink)malloc(sizeof(treenode));         p->data=i;         p->state=0;         p->ltree=p->rtree=NULL;         EnQueue(Q,p);         if(EmptyQueue(Q))         q=Gettop(Q);         if(p&&q)        { if(m%2==0)q->ltree=p;         else q->rtree=p;}         if(i%2==1)DeQueue(Q);     } 这段代码的本意是想做什么？创建一个Queue吗？ 另外，能不能先把你的代码排一下啊？看得头痛。。。

你单步跟踪执行下. 对程序的调试是程序员的基本功.

我调试代码一般打个断点，或者加个测试语句，看一下和自己预期的是否有问题

n是小球的个数！

多谢各位了！刚开始练，代码格式什么的没在意！多谢！


Question: 一个很简单的贪心问题，看下为什么会超时啊

引用 1 楼 user-2 的回复:题目中的输入描述第一句是"You will be given a number of cases in the input.",但样例输入缺了这个数.而LZ程序是按错误的样例输入编写的,即没有处理第一个数.  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1161中的样例输入与题目中的描述是一致的.建议LZ试一下增加处理case数的处理. 应该不是这个问题的了

如下修改可在ZO上AC：  #include <stdio.h> #include <stdlib.h> #include<string.h>  int h; int fi[30]; int di[30]; int ti[30]; int num;  void regret() {     int tem=0;     int max=0;     int remain;     /*删int fish[30]={0};*/     int anstime[30]={0};     int temtime[30]={0};     int i,j;     int fishnum;     int cur;     for(i=0;i<num;i++)     {        memset(temtime, 0, sizeof(temtime));/*加*/        remain=h;        fishnum=0;        for(j=0;j<=i;j++)          remain-=ti[j];        /*删 memcpy(fish,fi,sizeof(fi));*/        if (remain < 0) continue; /*加. 如果没有此行,当remain<0导致下面死循环而超时*/        while(remain)        {            cur=0,tem=0; /*改 tem=fish[0]*/            for(j=0;j<=i;j++)/*改 for(j=1;j<=i;j++)*/            {                if(tem<fi[j]-di[j]*temtime[j]) /*改 if(tem<fish[j])*/                {                    tem=fi[j]-di[j]*temtime[j];                    cur=j;                }            }             /*删 fish[cur]-=di[cur];*/            fishnum+=tem;            /*删             if(fish[cur]<0)               fish[cur]=0;*/            temtime[cur]++;            remain--;        }        if(fishnum>max)        {            max=fishnum;            memcpy(anstime,temtime,sizeof(anstime));        }        /*memset(temtime,0,sizeof(temtime));*/     }     for(i=0;i<num-1;i++)     printf("%d, ",anstime[i]*5);     printf("%d\n",anstime[num-1]*5);     printf("Number of fish expected: %d\n",max);     memset (anstime,0,sizeof(anstime)) ; }  int main() {     int i;     int t0, t1; /*加*/     scanf("%d", &t0); /*加*/     while (t0--) /*加*/     { /*加*/       t1 = 0; /*加*/       scanf("%d",&num);       while(num)       {           if (t1++) printf("\n"); /*加*/           scanf("%d",&h);           h=h*12;           for(i=0;i<num;i++)             scanf("%d",&fi[i]);           for(i=0;i<num;i++)             scanf("%d",&di[i]);           for(i=1;i<num;i++)              scanf("%d",&ti[i]);           regret();           memset (fi,0,sizeof(fi)) ;           memset (di,0,sizeof(di)) ;           memset (ti,0,sizeof(ti)) ;           scanf("%d",&num);       } /*加*/       if (t0 > 0) printf("\n"); /*加*/     }     return 0; }


Question: 函数行参中的*&同时出现什么意思

C的伪码； C++的引用。

//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组指向了一个指针，该指针指向一个函数，该函数的无参数，返回一个指针，该指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*x000)[5];//返回值     char (*(x00)())[5];//函数原型，参数为空，返回值为指针     char (*(*x0)())[5];//数组的元素，是个函数指针     char (*(*x[3])())[5];//是个数组，大小为3      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

版主精辟，是指针的引用

引用 4 楼 zaixiankaifa 的回复:先取地址再解引用不懂没事，但不能不懂装懂。 你说的先取地址再解引用应该是这个样子的。int a; int* p=&a;//取地址 int b=*p;//解引用 int b=*(&a);//合并的写法 这个和那个根本就没关系，这是C++里的引用，是对一个指针的引用，别误导别人啊。

先取地址再解引用

前者是指针，后者是引用。配合使用还是比较多的，比如在链表里面。举个例子吧： void create(Node *node){//改成Node *&node再试试     ……     node = (Node*)malloc(sizeof(Node));     …… }  int main(){     Node *p=NULL;     create(p);     ……//你可以观察下，执行后的p是否有分配空间     return 0; } 这里的问题，主要是指针本身是值传递的形式，他所指向的空间才是地址传递的。所以实参指针，和形参指针不是一个东西。如果你针对形参指针本身的操作，而不是里面的内容的话，那是无效的，因为你改变的只是一个局部变量。  解决方法就是把实参指针的地址一起传递过去，或者把这个指针return回去，还有就是你看到的传递指针的引用。关于C++的引用自己去了解下吧。简单来说就是引用变量和实际的参数是绑定在一起的，只是一个别名，两者是一个东西。

HL只是一个变量名而已！ LNode *&Hl; // 传的参数为LNode *类型变量的引用而已！ 因为LNode *a本身没有分配地址，所以传引用初始化的时候分配地址，当然传双指针也是可以的！

对LNode指针的引用，逻辑上，相当于  LNode**

指针的引用，你可以把指针看成了普通变量，然后加上引用，就会明白了。 当然，指针的引用int *&是正确的，切记别写成这样int &*  这种写法是错误的


Question: 大家帮忙看看这段代码，有几个问题

另一个问题也弄明白了，，279行输入后没有接收回车

引用 1 楼 u012840458 的回复:第264行==写成了=嗷，嗷。忘了这个

引用 1 楼 u012840458 的回复:第264行==写成了=


Question: 这个输出没有看懂，请帮忙。

明白了明白了。谢谢了。刚才真是转不弯来。

格式化输入输出的格式串参数中的格式，就是一个占位符号。  输出时，会被实参，按照格式输出的数据，替换掉。 ---实参转换成对应格式的字符串，替换掉对应的格式符号----   这里 “%s”就是一个格式符号。 实参是"%s! c is cool!\n"  替换以后输出 %s! c is cool!\n! c is cool!\n  其中\n是转义字符，会产生换行，实参的%s会原样输出。  printf("%s! c is cool!\n","%s! c is cool!\n");  相当于  puts("%s! c is cool!\n! c is cool!\n");

第二个字符串替换了第一个字符串中的%s 也就是说输出来的第一行实际上是第二个字符串，第二行才是第一个字符串

#define FORMAT "%s! c is cool!\n"  //帮你换一下，这样应该看懂了吧！后面的那个a变量，你只不过没有有变量名，而用了它本身名来当地址传 char a[] = "%s! c is cool!\n"; printf("%s! c is cool!\n", a);

其实你还真没理解为什么会输出前面那句有%s，不然就不会这么问了。 printf后面的参数会按前面的格式替换掉相应的内容，所以printf实际上转换成了这种形式：printf("%s! c is cool!\n! c is cool!\n");


Question: C语言 为结构体中的变量赋值，为什么不能用scanf？

必须可以

引用 7 楼 zhao4zhong1 的回复:关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习” 赵老师你太V5了，又崇拜您老了

可能是中间输入“错误”

引用 3 楼 Adol1111 的回复:除了main()写成mian没发现什么问题啊 又是马虎的结果

除了main()写成mian没发现什么问题啊

scanf遇空格，TAB，回车，会停止读取，无法确保赋值正确

你确认每次都成功输入了？scanf()函数成功返回了？

当然可以！楼主在调试一下


Question: 随机化数组算法

引用 13 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }    谢谢赵老师，赵老师辛苦了，还是代码给力。能加点分析就完美了O(∩_∩)O~

引用 11 楼 jiandingzhe 的回复:另外，C++标准库里好像有shuffle吧？你可以看看它是怎么做的。 ++  C++ 标准库确实有洗牌算法，shuffle

引用 6 楼 shangyu0801 的回复:[quote=引用 5 楼 taodm 的回复:] 写正确一个随机算法是需要极好的数学基础的，因为你得证明随机性。 还是把精力放在其它更有价值的东西上吧。 其实我只是想随机化一个数组，最重要的是我觉得，是思考本身，而不是思考什么问题。 本例中那个for+while(1)的用法，让我很难受，但是实在想不到好的方法。[/quote] 做一个sort，让sort的依据是随机的。 另外，C++标准库里好像有shuffle吧？你可以看看它是怎么做的。

引用 9 楼 starytx 的回复:循环一遍，将第i个和随机出来的位置的元素交换不行吗？ 恩，这样也行。等下班了，试试这样。呵呵

循环一遍，将第i个和随机出来的位置的元素交换不行吗？

引用 7 楼 netbooting 的回复:随机化数组下标是神马意思？？将数组元素随机排列？ 恩

随机化数组下标是神马意思？？将数组元素随机排列？

引用 5 楼 taodm 的回复:写正确一个随机算法是需要极好的数学基础的，因为你得证明随机性。 还是把精力放在其它更有价值的东西上吧。 其实我只是想随机化一个数组，最重要的是我觉得，是思考本身，而不是思考什么问题。 本例中那个for+while(1)的用法，让我很难受，但是实在想不到好的方法。

引用 2 楼 taodm 的回复:stl里randomXX函数现成的啊。楼主是根本不会偷懒啊，因为库不熟啊。 嗯，主要是对库不熟悉，呵呵。不过这些还是想自己动手写写玩O(∩_∩)O~

引用 1 楼 caozhy 的回复:随机洗牌？  最简单的思路就是用随机数作为条件，给数组排序。 怎样用随机数作为条件呢？给数组按照什么排序啊？请指教

stl里randomXX函数现成的啊。楼主是根本不会偷懒啊，因为库不熟啊。

随机洗牌？  最简单的思路就是用随机数作为条件，给数组排序。


Question: 想将书上一个例子程序分成几个部分~~不会引用结构类型~~编译器是codeblocks~~求指教~~

int main().c这样的文件命名不合法吧？你可以重命名为main.c，在当中写入： int main(int argc, char* argv[]) {     return 0; }  引用 楼主 pokerLee 的回复:范例程序如下~~程序过长~~想分成几个部分~~ http://my.oschina.net/u/1408882/blog/178570 个人练习的分成如下几部分~~ 报错不正常~~程序本身可以运行~~求指点~~

先学学基础的东西，按部就班的练习，没有那本书上会建议你用含空格和括号的源文件名称。  引用 3 楼 pokerLee 的回复:引用 1 楼 user-2 的回复:除了main是.c文件以外，其他的都是.h文件吧引用结构类型的时候怎么引用？求指点~~

除了main是.c文件以外，其他的都是.h文件吧


Question: C语言 新人请教一个问题。

引用 5 楼 max_min_ 的回复:[quote=引用 4 楼 u012388912 的回复:] [quote=引用 3 楼 max_min_ 的回复:] 楼主为什么认为解密是返回-10的操作呢？ 假设a的话，加密+5变成了f，然后解密的话-5才能变成a的吧，如果-10，回不去了！  噢，，这点我理解错了。。  但是  假设经过加密函数abc后 a变成了f。 那下面调用解密函数的时候传给形参的值为什么是f而不是原先的a呢？  经过加密函数原字符串应该是不会变的啊？ [/quote] 第一：形参只有类型有用而已，里面放不放变量名都是没有关系的！ 第二：因为你传的数组名，数组作为参数的时候和指针是一样的，操作的是地址！当你修改地址上的内容的时候，显然当你再通过地址访问的时候，它的值已经发生变化的的！而且你这样是才是正确的！要不然也达不到加密的作用了![/quote]  明白了~  谢谢啦~~

5楼正解

引用 4 楼 u012388912 的回复:[quote=引用 3 楼 max_min_ 的回复:] 楼主为什么认为解密是返回-10的操作呢？ 假设a的话，加密+5变成了f，然后解密的话-5才能变成a的吧，如果-10，回不去了！  噢，，这点我理解错了。。  但是  假设经过加密函数abc后 a变成了f。 那下面调用解密函数的时候传给形参的值为什么是f而不是原先的a呢？  经过加密函数原字符串应该是不会变的啊？ [/quote] 第一：形参只有类型有用而已，里面放不放变量名都是没有关系的！ 第二：因为你传的数组名，数组作为参数的时候和指针是一样的，操作的是地址！当你修改地址上的内容的时候，显然当你再通过地址访问的时候，它的值已经发生变化的的！而且你这样是才是正确的！要不然也达不到加密的作用了!

引用 3 楼 max_min_ 的回复:楼主为什么认为解密是返回-10的操作呢？ 假设a的话，加密+5变成了f，然后解密的话-5才能变成a的吧，如果-10，回不去了！  噢，，这点我理解错了。。  但是  假设经过加密函数abc后 a变成了f。 那下面调用解密函数的时候传给形参的值为什么是f而不是原先的a呢？  经过加密函数原字符串应该是不会变的啊？

应该是-5，LZ可以运行看看啊


Question: 大神！帮帮忙！结构体里只有一个变量有什么意义？

引用 4 楼 taodm 的回复:楼主可以去买一本《重构：改善既有代码的设计》，看代码的22种坏味道 之 基本数据类型偏执 引用 5 楼 u011488256 的回复:这个结构题里面的值很重要，单独开来。   或者他的存在标志着另外一个结构体来着·  大神，爱死你们了！

这个结构题里面的值很重要，单独开来。   或者他的存在标志着另外一个结构体来着·

你的看看ui32是怎么使用的（在哪些地方被调用）。

引用 1 楼 user-4 的回复:有各种可能，正确的答案要问开发者 那么能不能举个例子呢？

有各种可能，正确的答案要问开发者


Question: for循环语句与递归语句结合使用的执行过程？

调试的时候单步执行，查看变量的值的变化。  引用 楼主 u012406782 的回复:字符串的全排列的实现代码：求执行过程？ void Permutation(char* pStr, char* pBegin)   {       assert(pStr && pBegin);          if(*pBegin == '\0')           printf("%s\n",pStr);       else       {           for(char* pCh = pBegin; *pCh != '\0'; pCh++)           {               swap(*pBegin,*pCh);               Permutation(pStr, pBegin+1);               swap(*pBegin,*pCh);           }       }   }

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

好吧  今天比较闲 这个说起来比较复杂，不如画图清晰 abc为例 首先pCh和pBegin都指向a 进入第一次for循环 swap(a,a)相当于没交换 然后递归调用函数（设为函数2），参数分别是abc(pStr),bc(pBegin+1) 函数2中 pCh和pBegin都指向b 进入这个递归函数2的第一次for循环 在这里先swap， 在递归，设为函数3，参数分别是abc(pStr),c(pBegin+1) pCh和pBegin都指向c 进入函数3的第一次for循环 swap(c,c), 再递归，设为函数4，参数分别是abc(pStr),\0(pBegin+1) 注意，在递归函数4中，*pBegin=='\0',所以打印出abc,并且返回到调用它的函数，即函数3的for循环中 函数3执行Permutation函数后的swap，并且结束for循环，返回到调用它的函数，即函数2的for循环中 我们上面讨论过，函数2的参数是abc和bc，并且以上步骤在函数2中pCh指向的b 那么，下一次循环pCh指向c，进入for swap(b,c)，那么字符串就变成了acb 然后再递归调用Permutation（acb，cb） 按照之前的步骤，会输出acb  这样一步一步来，没有什么特殊的技巧，熟能生巧而已，最好的办法就是单步调试，跟踪变量的值

我希望得到的是执行过程，一步一步的，举个简单的例子abc执行过程应该不是太多，求细致的讲解，小弟才大一实在是不懂？

引用 3 楼 u012406782 的回复:还是不懂，能不能讲得更详细一些，拜托了。 自己举个例子，字符串abc 在算法的else部分里 首先以a作为第一个字符，递归全排列bc 然后pCh++，指向b，swap(a,b)就是以b作为第一个字符，再全排列ac 最后pCh指向字符c，swap(a,c)就是以c作为第一个字符，全排列ba

还是不懂，能不能讲得更详细一些，拜托了。


Question: linux c程序往Mysql中插入一条数据。错误百出啊

gcc加这个： -L/usr/lib64/mysql -lmysqlclient 参考你的系统平台

引用 楼主 abc594986308 的回复: /*往Mysql数据库中插入一条数据。好多未定义，还外带一个返回值错误，我的智商受不了啊。求大神来看看*/ #include<mysql/mysql.h>		//包含MySQL函数库 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {    MYSQL *mysql;					// 声明MySQL操作符    MYSQL_RES *res;					// 声明结果集    MYSQL_ROW row;					// 声明行操作符    char sqlcmd[200];					// 保存插入语句    int t,r;    mysql=mysql_init(NULL);						// 初始化连接处理程序    if (!mysql_real_connect(mysql, "127.0.0.1", "root", "", "test", 0, NULL, 0)){	// 建立数据库连接       fprintf(stderr, "无法连接数据库，错误原因：%s\n",       mysql_error(mysql));	       							// 捕捉MySQL错误    }    else {       puts("数据库连接成功");       sprintf(sqlcmd, "%s", "insert into users(name,password) value(\'mr\',\'111\')");       t = mysql_real_query(mysql,sqlcmd,(unsigned int) strlen(sqlcmd));			// 执行插入语句       if (t)          printf("插入数据库失败：%s\n", mysql_error(mysql));       else {                       printf("插入成功！\n");          }                }       mysql_close(mysql);								// 关闭数据库连接    return EXIT_SUCCESS; }   贴下错误 在函数‘main’中： 14.2.c:(.text+0x21)：对‘mysql_init’未定义的引用 14.2.c:(.text+0x63)：对‘mysql_real_connect’未定义的引用 14.2.c:(.text+0x77)：对‘mysql_error’未定义的引用 14.2.c:(.text+0x130)：对‘mysql_real_query’未定义的引用 14.2.c:(.text+0x14e)：对‘mysql_error’未定义的引用 14.2.c:(.text+0x17b)：对‘mysql_close’未定义的引用 collect2: error: ld returned 1 exit status 在编译的时候要链接一下对应的动态链接库

连接数据库了吗？

你编译的时候连接库了吗？

你是在什么平台上编译的，linux上么，编译的命令什么？


Question: 渐进时间复杂度的计算，谁还记得

引用 7 楼 truelance 的回复:你就不会百度一下么. 渐进时间复杂度就是普通说的时间复杂度(大O记法) 渐进时间复杂度T(n) = O(f(n))的要求是当n趋向无穷大时, T(n)/f(n)是一个非0常数. 引用 7 楼 truelance 的回复:你就不会百度一下么. 渐进时间复杂度就是普通说的时间复杂度(大O记法) 渐进时间复杂度T(n) = O(f(n))的要求是当n趋向无穷大时, T(n)/f(n)是一个非0常数. ++ 简单来说，就是商的极限是常量。

引用 5 楼 u012915167 的回复:[quote=引用 4 楼 lidonghit 的回复:] 里面的求和为n-i-1。i=0一直加到i=n-2,即从n-1加到1得n(n-1)/2。 哟西.你还记得那个"E"的计算吗?[/quote] 请查查等差数列求和公式

真心觉得这个不是很常用

引用 4 楼 lidonghit 的回复:里面的求和为n-i-1。i=0一直加到i=n-2,即从n-1加到1得n(n-1)/2。 哟西.你还记得那个"E"的计算吗?

引用 2 楼 lidonghit 的回复:一个是时间复杂度，一个是渐近时间复杂度。前者是某个算法的时间耗费，它是该算法所求解问题规模n的函数，而后者是指当问题规模趋向无穷大时，该算法时间复杂度的数量级。 我是说计算呢,概念你还记得哈.

抢到沙发


Question: 求大神帮忙看看这段代码

找到原因了，，因为直接执行put()的话，，head就没有分配空间了，，用malloc给head分配个空间就行了  分享一下修改后的代码 #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define N sizeof(struct person)  struct person { 	int num;//联系人序号 	char name[20];//联系人名字 	int phone;//联系人电话 	struct person *next; };  void menu();//主菜单 void put();//输出联系人 void save(struct person *head);//存储联系人 void add(struct person *head);//添加联系人 struct person *creat(int nn);  int i,j;  void main() { 	int aa; 	struct person *head; 	 	while(1) 	{ 		printf("输入\n"); 		scanf("%d",&aa); 		fflush(stdin); 		switch(aa) 		{ 		case 1:	head=creat(1); 				save(head);break;  		case 2:	put();break;  		case 3:	add(head); 				break; 		case 0: exit(0); 		} 	} 	 }  struct person *creat(int nn) { 	int n=0; 	int no;//记录联系人序号 	no=nn; 	struct person *head,*p1,*p2; 	p1=p2=(struct person *)malloc(N); 	p1->num=no; 	printf("输入联系人姓名:"); 	gets(p1->name); 	printf("输入联系人5位号码:"); 	scanf("%d",&p1->phone); 	head=NULL; 	while(p1->phone!=0) 	{ 		n=n+1; 		if(n==1)head=p1; 		else p2->next=p1; 		p2=p1; 		p1=(struct person *)malloc(N); 		fflush(stdin); 		printf("输入联系人姓名:"); 		gets(p1->name); 		no++; 		p1->num=no; 		printf("输入联系人5位号码:"); 		scanf("%d",&p1->phone); 		 	} 	p2->next=NULL; 	 	return head; 	  }   void save(struct person *head) { FILE *fp; 	if((fp=fopen("PhoneBook.dat","wb"))==NULL) 	{ 		printf("打开错误"); 		return; 	} 	struct person *p; 	p=head; 	if(head!=NULL) 	do 	{ 		if(fwrite(p,sizeof(struct person),1,fp)!=1) 		{printf("写入错误");} 		p=p->next; 	}while(p!=NULL); 	fclose(fp); }   void put() { 	FILE *fp; 	struct person *p; 	if((fp=fopen("PhoneBook.dat","rb"))==NULL) 	{ 			printf("打开错误"); 			return; 	} //	p=head; 	p=(struct person *)malloc(N*sizeof(struct person));  		while(fread(p,sizeof(struct person),1,fp)) 		{ 			printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone); 			p++; 		} 	fclose(fp);	 }

那个复制的时候漏掉了，，还有一件找到原因了，，谢谢啊

void main() {     int aa;             while(1)     {         printf("输入\n");         scanf("%d",&aa);         fflush(stdin);         switch(aa)         {         case 1:    head=creat(1);                 save(head);break;           case 2:    put(head);break;//这个head定义在哪里？？？？           case 3:    add(head);                 break;         case 0: exit(0);         }     }       }


Question: 关于归并排序的错误

供参考： // // divide and conquer //   #include <stdio.h> #include <stdlib.h>   //#define N 10 #define N 9   void merge(int a[], // target 		   int b[], int bn, int c[], int cn) { 	int i, bi, ci;  	for (i=0, bi=0, ci=0; bi<bn && ci<cn; ) 	{ 		if (b[bi] <= c[ci]) 			a[i++] = b[bi++]; 		else 			a[i++] = c[ci++]; 	}  	if (bi < bn) 	{ 		while (bi < bn) a[i++] = b[bi++]; 	} 	else if (ci < cn) 	{ 		while (ci < cn) a[i++] = c[ci++]; 	} }  void merge_sort(int a[], int n) { 	if (n > 1) 	{ 		int b[N], c[N];  		memcpy(b, a, n/2 * sizeof(int)); 		memcpy(c, a + n/2, (n/2 + n%2) * sizeof(int));  		merge_sort(b, n/2); 		merge_sort(c, n/2 + n%2); 		merge(a, b, n/2, c, n/2 + n%2); 	} }   int main(void) { 	int a[N], i;  	// random N int-numbers 	srand((unsigned int)GetTickCount()); 	for (i = 0; i < N; i++) a[i] = rand();  	// print 	printf("Before sorting: \n"); 	for (i = 0; i < N; i++) printf("%d ", a[i]);  	merge_sort(a, N);  	// print 	printf("After sorting: \n"); 	for (i = 0; i < N; i++) printf("%d ", a[i]);  	getch(); 	return 0; }

msort(L->R,L->R,0,L->length-1);  归并排序需要2倍存储空间,  不能在自身空间上进行归并


Question: 我想问一下32数据异或和64数据异或时间为什么消耗的时间相差不大

引用 3 楼 guogl1988 的回复:[quote=引用 1 楼 truelance 的回复:] 如果CPU是64位的, 那就应该是一样快啊. 如果CPU是32位的, 那64位运算才会慢. 哦，这样，与CPU位数有关，那就是说CPU内部对于按位异或操作是一个并行化的操作吗？在64位CPU中64个位上的数据都同时完成，对吗？[/quote] 是的

引用 1 楼 truelance 的回复:如果CPU是64位的, 那就应该是一样快啊. 如果CPU是32位的, 那64位运算才会慢. 哦，这样，与CPU位数有关，那就是说CPU内部对于按位异或操作是一个并行化的操作吗？在64位CPU中64个位上的数据都同时完成，对吗？


Question: 如果英语不好，数学不好，啥也不好，能学好C/c++吗？

引用 31 楼 zouanxu01 的回复:谢谢你们哦！，但是关于数学的算法，函数学好，还有那些，我现在是初中生。 佩服！加油！！！

完全能胜任一个coder的工作， 但是永远成不了一名programmer.

只要你喜欢编程,好好去学了, 我觉得一定可以!  跟英语.数学.什么的关系不大.  这么说吧,计算机本来就是一门比较杂的科目,英语你不会都可以(个人认为). 数学的话是研究数据结构等课程要用到的,跟你学习C/C++也没多大关系.  最后: 放开去学吧,祝你成功

引用 31 楼 zouanxu01 的回复:谢谢你们哦！，但是关于数学的算法，函数学好，还有那些，我现在是初中生。看了这么久，才发现你是初中生，我  引用 46 楼 zhang5476499 的回复:答案是：能。但是你要想做出搞质量的程序，你花费的时间和脑力要比别人多。看看数据结构的头痛问题就知道啦。对了楼主，据我目前接触的编程与数学挂钩的问题，一般都不是和中学的数学挂钩，而是与大学的数学挂钩。

哦，对了，这里先给楼主泼盆冷水，不是说学了某某语言之后，或者说放弃什么来一心学某某语言时候，你就可以当上总经理，迎娶白富美，走上人生巅峰的。   写代码的也有三六九等。如果你什么都不懂，只学C语言的话，那么很不幸，你就是干那些最底层的活，领情那点不够挥霍的薪水。   当然我相信随着你的深入学习，你的很多观念会越来越成熟的。

可以入门，想学精还是要看老外写的原版的书籍，国产的那些个垃圾书籍···

引用 41 楼 u012967319 的回复:故事來自一本忘記的事  有2個數學家跟2個程式員一起坐火車去北京,他們坐了在一起  數學家問程式員:你們買了多少張票? 程式員回答:2張票! 數學家說:我們只買了一張票!  到了檢票時,數學家們躲了在廁所里,檢票員敲敲門,叫檢票啦!! 數學家說,我正在忙中,然後把票從門逢下申出,讓檢票員檢查.  回程時,2個數學家跟2個程式員又同一車了  數學家問程式員:你們買了多少張票? 程式員回答:1張! 數學家說:我們沒買票!  到了檢票時,程式員們躲了在廁所里,檢票員敲敲門,叫檢票啦!! 程式員說,我正在忙中,然後把票從門逢下申出,讓檢票員檢查.  這票一去就沒回過了 这个故事我可以转走吗？

英文不好不是什麼大不了,如果學深了,很多時候書是教不了你 都是要上網找的,資料最多的就是英文網,但現在國家人才出眾 已經有很多中文翻譯,英文已經不再是入門的條件了, 話是這麼說,但真的學深工作後,會與上很多變量,總不能A,B,C的改名吧 雖然英文文法用不上,但一點英文詞也得學學  數學不好就是大事,學程式可以不會數學,但開發有用的程式肯定離不開數學 由其想理解程式更深的一面,或看懂別人的程式,不會數學,就算知道程式過程, 也不知道到底在運算什麼,應該出什麼結果

楼主，告诉你一个有意思的事。 我曾经主持公司的招聘工作，得出几个有趣的公式。  1. 编程能力强的，英语一般不好。 2. 英语好的，编程能力一般都不强。 3. 如果是D员，英语和编程都不强。

去试了才知道，毕竟不一样的角度。

数学和英语都比C++重要。

今天不好不代表明天不好明天好不代表后天好只要每天好好学习就会越来越好。

不会影响的,英语和编程语言完全是两码事,数学的话,也就是会运用到一些算法,不过算法不会很难,只要弄懂了算法的公式,剩下的就是+-*/了,因为计算机做的就只有基本的简单运算!

不好分很多种  没天赋，咋学都没用 特别懒，就是不学，能好才怪 方法不对，事倍功半，找个好老师跟着学  看自己是哪一种，懒是最没得治的，懒人就该让他烂一辈子吧。

数学还是要懂点，怎么说算法都是要求数学知识啊

有兴趣学好的可能性会大些

谢谢你们哦！，但是关于数学的算法，函数学好，还有那些，我现在是初中生。

学校学不好只是代表你没学 又不是证明你笨你傻  用心学没什么学不会的