Question: 怎样判断一个c函数是posix的？

mktime()—Converts time formats 363 modf()—Breaks a value into integral and fractional parts 364 open()—Opens a file 365 opendir()—Opens a directory 367 pathconf()—Gets configuration variables for a path 368 pause()—Suspends process execution 370 perror()—Prints an error message 371 pipe()—Creates an interprocess channel 372 pow()—Computes x raised to the power y 373 printff()—Writes formatted text to the standard output stream 374 putc()—Writes a character to a stream 378 putchar()—Writes a character to standard output 379 puts( )—Writes a string to standard output 380 qsort()—Sorts an array 381 raise()—Sends a signal 383 rand()—Retums a random number 384 read()—Reads from a file 385 readdir()—Reads a directory 387 realloc()—Changes the size of a memory object 389 remove()—Removes a file from a directory 390 rename()—Renames a file 391 rewind()—Sets the file position to the beginning of the file 393 rewinddir()—Resets the readdir() pointer 394 rmdir()—Removes a directory 395 scanf()—Reads formatted text from standard input stream 396 setbuf()—Determines how a stream will be buffered 400 setgid()—Sets group ID 401 setjmp()—Saves the calling environment for use by longjmp() 403 setlocale()—Sets or queries a program's locale 405 setpgid()—Sets process group ID for job control 406 setsid()—Creates a session and sets the process group ID 407 setuid()—Sets the user ID 408 setvbuf()—Determines buffering for a stream 410 sigaction()—Examines and changes signal action 412 sigaddset()—Adds a signal to a signal set 414 sigdelset()—Removes a signal from a signal set 415 sigemptyset()—Creates an empty signal set 416 sigfillset()—Creates a full set of signals 417 sigismember()—Tests a signal set for a selected member 418 siglongjmp()—Goes to and restores signal mask 419 signal()—Specifies signal handling 420 sigpending()—Examines pending signals 422 sigprocmask()—Examines and changes blocked signals 423 sigsetjmp()—Saves state for siglongjmp() 425 sigsuspend()—Waits for a signal 427 sin()—Computes the sine function 428 sinh()—Computes the hyperbolic sine of x 429 sleep()—Delays process execution 430 sprintf()—Formats a string 431 sqrt()—Computes the square root function 435 srand()—Sets a seed for the rand() function 436 sscanf()—Parses a string 437 stat()—Gets information about a file 441 strcat()—Concatenates two strings 442 strchr()—Scans a string for a character 443 strcmp()—Compares two strings 444 strcoll()—Compares two strings using the current locale 445 strcpy()—Copies a string 446 strcspn()—Searches a string for characters which are not in the second string strerror()—Converts an error number to a string 448 strftime()—Formats date/time 449 strlen()—Computes the length of a string 451 strcat()—Concatenates two counted strings 452 strncmp()—Compares two counted strings 453 strncpy()—Copies a counted string 454 strpbrk()—Searches a string for any of a set of characters 455 strrchr()—Locates the last occurrence of a character in a string 456 strspn()—Searches a string for any of a set of characters 457 strstr()—Locates a substring 458 strtod()—Converts a string to double 459 strtok()—Breaks a string into tokens 461 strtol()—Converts a string to long int 462 strtoul()—Converts a string to unsigned long int 464 strxfrm()—Transforms strings using rules for locale 466 sysconf()—Gets system configuration information 468 system()—Executes a command 470 tan()—Computes the tangent of x 471 tanh()—Computes the hyperbolic tangent of x 472 tcdrain()—Waits for all output to be transmitted to the terminal 473 tcflow()—Suspends/restarts terminal output 474 tcflush()—Discards terminal data 476 tcgetattr()—Gets terminal attributes 477 tcgetpgrp()—Gets foreground process group ID 478 tcsendbreak()—Sends a break to a terminal 480 tcsetattr()—Sets terminal attributes 481 tcsetpgrp()—Sets foreground process group ID 483 time()—Determines the current calendar time 484 times()—Gets process times 485 tmpfile()—Creates a temporary file 486 tmpnam()—Generates a string that is a valid non-existing file name 487 tolower()—Converts uppercase to lowercase 488 toupper()—Converts lowercase to uppercase 489 ttyname()—Determines a terminal pathname 490 tzset()—Sets the timezone from environment variables 491 umask()—Sets a file creation mask 492 uname()—Gets system name 493 ungetc()—Pushes a character back onto a stream 495 unlink()—Removes a directory entry 496 utime()—Sets file access and modification times 497 va_arg()—Gets the next argument 499 va_end()—Ends variable argument list 501 va_start()—Starts a variable argument list 502 vfprintf()—Writes formatted text with a variable argument list 503 vprintf()—Write formatted text to standard output with a variable argument list vsprintf()—Write formatted text to a string with a variable argument list wait()—Waits for process termination 507 waitpid()—Waits for process termination 509 wcstombs()—Converts a wide character string to a multibyte character string wctomb()—Converts a wide character to a multibyte character 512 write()—Writes to a file

abort()— Causes abnormal process termination 211 abs()—Computes the absolute value of an integer 212 access()—Tests for file accessibility 213 acos()—Computes the principal value of arc cosine 215 alarm()—Schedules an alarm 216 asctime()—Converts a time structure to a string 217 asin()—Computes the principal value of the arc sine 218 assert()—Aborts the program if assertion is false 219 atan()—Computes the principal value of the arc tangent 221 atan2()—Computes the principal value of the arc tangent of y/x 222 atexit()—Registers a function to be called at normal program termination atof()—Converts a text string to double 224 atoi()—Converts a text string to integer 225 atol()—Converts a text string to long integer 226 bsearch()—Searches a sorted array 227 calloc()—Allocates and zeroes memory 229 ceil()—Computes the smallest integer greater than or equal to x 230 cfgetispeed()—Reads terminal input baud rate 231 cfgetospeed()—Reads terminal output baud rate 232 cfsetispeed()—Sets terminal input baud rate 233 cfsetospeed()—Sets terminal output baud rate 234 chdir()—Changes the current working directory 235 chmod()—Changes file mode 236 chown()—Changes the owner and/or group of a file 238 clearerr()—Clears end—of-file and error indicators for a stream 240 clock( )—Determines processor time used 241 close()—Closes a file 242 closedir()—Ends directory read operation 243 cos()—Computes the cosine function 244 cosh()—Computes the hyperbolic cosine function 245 creat()—Creates a new file or rewrites an existing one 246 ctermid()—Generates terminal pathname 247 ctime()—Formats a calendar time 248 cuserid()—Gets user name 249 difftime()—Computes the difference between two times 250 div()—Computes the quotient and remainder of an integer division 251 dup()—Duplicates an open file descriptor 252 dup2()——Duplicates an open file descriptor 253 execl()—Executes a file 254 execle()—Executes a file 256 execlp()—Executes a file 258 execv()—Executes a file 260 execve()—Executes a file 262 execvp()—Executes a file 264 exit()—Causes normal program termination 266 _exit()—Terminates a process 267 exp()—Computes the exponential function 268 fabs()—Computes the absolute-value function 269 fclose()—Closes an open stream 270 fcntl()—Manipulates an open file descriptor 271 fdopen()—Opens a stream on a file descriptor 274 feoff()—Tests the end-of-file indicator for a stream 275 ferror()—Tests the error indicator for a stream 276 fflush()—Updates stream 277 fgetc()—Reads a character from a stream 278 fgetpos()—Gets the current file position 279 fgets( )—Reads n characters from a stream 280 fileno()—Maps a stream pointer to a file descriptor 281 floor( )—Computes the largest integer not greater than x 282 fmod()—Computes the remainder of x/y 283 fopen()—Opens a stream 284 fork()—Creates a process 285 fpathconf()—Gets configuration variable for an open file 287 fprintf( )—Writes formatted text to a stream 289 fputc( )—Writes a character to a stream 293 fputs()—Writes a string to a stream 294 fread()—Reads an array from a stream 295 free()—Deallocates dynamic memory 296 freopen()—Closes and then opens a stream 297 frexp()—Breaks a floating-point number into a fraction and integer 298 fscanf( )—Reads formatted input from a stream 299 fseek()—Sets file position 302 fsetpos()—Sets the file position for a stream 303 fstat()—Gets file status 304 ftell()—Gets the position indicator for a stream 305 fwrite()—Writes an array to a stream 306 getc()—Reads a character from a stream 307 getchar()—Reads a character from standard input 308 getcwd()—Gets current working directory 309 getegid()—Gets effective group ID 310 getenv()—Gets the environment variable 311 geteuid()—Gets effective user ID 313 getgid()—Gets real group ID 314 getgrgid()—Reads groups database based on group ID 315 getgrnam)—Reads group database based on group name 316 getgroups()—Gets supplementary group IDs 317 getlogin()—Gets user name 319 getpgrp()—Gets process group ID 320 getpid()—Gets process ID 321 getppid()—Gets parent process ID 322 getpwnam()—Reads user database based on user name 323 getpwuid()—Reads user database based on user ID 324 gets()—Reads a string from standard input 325 getuid()—Gets real user ID 326 gmtime()—Breaks down a timer value into a time structure in Coordinated Universal Time (UTC) isalnum()—Tests for alphabetic or numeric character 328 isalpha()—Tests for alphabetic character 329 isatty( )—Determines if a file descriptor is associated with a terminal 330 iscntrl()—Tests for control character 331 isdigit()—Tests for decimal-digit character 332 isgraph()—Tests for printing character 333 islower()—Tests for lowercase character 334 isprint()—Tests for printing character 335 ispunct()—Tests for punctuation 336 isspace()—Tests for white-space character 337 isupper()—Tests for uppercase alphabetic character 338 isxdigit()—Tests for hexadecimal-digit character 339 kill()—Sends a signal to a process 340 labs()—Computes the absolute value of a long integer 341 ldexp()—Multiplies a floating-point number by a power of 2 342 ldiv()—Computes the quotient and remainder of integer division 343 link()—Creates a link to a file 344 localeconv()—Gets rules to format numeric quantities for the current locale localtime()—Breaks down a timer value into a time structure in local time log()—Computes the natural log function 347 loglO()—Computes the base-ten logarithm function 348 longjmp()—Restores the calling environment 349 lseek()—Repositions read/write file offset 350 malloc()—Allocates dynamic memory 352 mblen()—Determines the number of bytes in a character 353 mbstowcs()—Converts a multibyte string to a wide-character string 354 mbtowc()—Converts a multibyte character to a wide character 355 memchr()—Scans memory for a byte 356 memcmp()—Compares two memory objects 357 memcpy()—Copies non-overlapping memory objects 358 memmove()—Copies (possibly overlapping) memory objects 359 memset( )—Fills memory with a constant byte 360 mkdir()—Makes a directory 361 mkfifo()—Makes a FIFO special file 362

引用 4 楼 xhu_eternalcc 的回复:[quote=引用 2 楼 Intel0011 的回复:] 查posix库信息 能详细点吗？[/quote] 《POSIX Programmer's Guide》这本书中Library Functions一章中有列举

man 2是c语言函数库 man 3是系统调用

引用 2 楼 Intel0011 的回复:查posix库信息 能详细点吗？

引用 1 楼 user-3 的回复:当然是都用C标准库的，posix的能不用就不用啊 嗯，但是有时得用非标准库的东西，比如isatty，那么怎么判断是posix呢？

查posix库信息

当然是都用C标准库的，posix的能不用就不用啊


#include  "stdio.h" #include "string.h"  char str1[]={"china"}; char str2[]={"chinese"}; //if(strcmp(str1,str2)) if(strcmp(str1,str2)==0) //0表示相等  { printf("yes"); } else { printf("NO"); }

经测试时Yes

Return Value  The return value for each of these functions indicates the lexicographic relation of string1 to string2.  Value Relationship of string1 to string2  < 0 string1 less than string2  0 string1 identical to string2  > 0 string1 greater than string2   if测试时，把0看作是false，正数和负数都看作是true


Question: 字符型数据和整形数据组成的结构体类型用sizeof测出的长度为8？

搜 内存对齐  和  pragma pack()

struct Student     {         int mun;                    --->  4         char name[20];       ---> 20         char sex;                  --->  1    --> 与上面的20一起进行填充对齐边界『4的倍数』，故21对齐为24         int age;                     --->  4         float score;              --->  4         char addr[30];         --->  32     };

引用 1 楼 user-2 的回复: 请问怎么结构对其？是向长度最长的成员对其吗？  #include <stdio.h> int main() { 	struct Student 	{ 		int mun; 		char name[20]; 		char sex; 		int age; 		float score; 		char addr[30]; 	}; 	printf("%d\n", sizeof(struct Student));//68 	return 0; }  如果是的话这里有2个整形，1个单精度型，51个字符型，应该是(2+1+51)*4=216字节？为什么显示68呢？ 是我哪里理解错了吗？

struct Char_Int     {         char c;         int i;     }; 结构对齐，中间空隙填充所致


Question: 关于swap函数中的*和&求大神解释

一个是c++的东东，一个是c里的东东。 用&在传入参数的时候可以直接传入变量名而不用考虑其他。

引用是对指针的封装 楼主的swap1和swap2两个函数，估计编译成机器命令后是一模一样的（哪怕编译器不进行任何优化）

仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

引用 6 楼 chengye_xin 的回复:*是指针，C程序员比较喜欢用，C++中逐渐被&取代 &是引用，只在C++中用  具体的区别，基本功能上没有区别，可以互换，可以将&理解为对*的优化：*可能为空，而使用空指针可能造成程序崩溃，而&使用前必须初始化，因而使用&代替*可以避免空指针导致的错误。  具体的可以去查询一下指针和引用的区别。  以上。  http://www.cnblogs.com/kingln/articles/1129114.html  具体的可以参考这个贴，讲的很详细。

&为引用，应该是C++里的东西，就是给变量起个别名。* 为指针，传进函数的参数为实参的拷贝。我也说不太明白了

void swap1(int &x,int &y) -----> 通过引用实现交换，C++中可用，C中不可用  void swap2(int *x,int *y)  ----->通过指针实现交换，C++和C中都可用


Question: 伪随机数加密 为什么要+33？

引用 1 楼 user-1 的回复:查一下该算法的原理 你看明白了吗？ 如果你看明白了，能不能讲讲

查一下该算法的原理


Question: 特定文件枚举！

#include <Windows.h> #include <stdio.h> #include <Shlwapi.h>  #pragma comment(lib, "Shlwapi")  void enum_path(char *cpath, char *ext) {     WIN32_FIND_DATA wfd;     HANDLE hfd;     char cdir[MAX_PATH];     char subdir[MAX_PATH];      GetCurrentDirectory(MAX_PATH, cdir);    SetCurrentDirectory(cpath);     hfd = FindFirstFile("*.*", &wfd);     if (hfd != INVALID_HANDLE_VALUE)     {       do        {           if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)           {              if (wfd.cFileName[0] != '.')              {                 // 合成完整路径名                 sprintf(subdir, "%s\\%s", cpath, wfd.cFileName);                 // 递归枚举子目录                 enum_path(subdir, ext);             }          }          else          {              if (!lstrcmp(PathFindExtension(wfd.cFileName), ext))                printf("%s\\%s\n", cpath, wfd.cFileName);           }        } while (FindNextFile(hfd, &wfd));     }     SetCurrentDirectory(cdir); }  int main(void) {    //MessageBox(NULL, "", "", MB_OK);    enum_path("D:\\VC\\C", ".c");    return 0; }


Question: 紧急,,,跪求大神帮忙! 统计一个字符串L（只包含大小写英文字母）中各个字符出现的次数

引用 5 楼 zcdabing 的回复:  // test.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include <map> #include <iostream>  using namespace std;   int _tmain(int argc, _TCHAR* argv[]) { 	map<char,size_t> mCount; 	char parr[] = "1234567890abcdefghijklmnopqistuvwxyz12345678901234567890"; 	for(int i=0;i!=strlen(parr);i++) 	{ 		map<char,size_t>::iterator cur = mCount.end(); 		map<char,size_t>::iterator pfind = mCount.find(parr[i]); 		if(cur!=pfind) 			pfind->second++; 		else 			mCount.insert(make_pair(parr[i],1)); 	}  	for(map<char,size_t>::iterator it = mCount.begin();it!=mCount.end();it++) 	{ 		printf("%c  %d\n",it->first,it->second); 	}   	return 0; }     看到0%的结贴率我后悔了，要是楼主不给结贴，以后再也不回0结贴率的帖子

简单写一下 #include <stdio.h>  int main(void) {    char str[] = "eradfdgeffasWWSDADAFWFFadad";    int i, j, sum = 0;     for (i = 'a'; i < 'z'; ++i)    {       for (j = 0; str[j]; ++j)       {          if (i == str[j])             ++sum;       }        if (sum)       {          printf("%c : %d\n", i, sum);          sum = 0;       }    }        for (i = 'A'; i < 'Z'; ++i)    {       for (j = 0; str[j]; ++j)       {          if (i == str[j])             ++sum;       }        if (sum)       {          printf("%c : %d\n", i, sum);          sum = 0;       }    }        return 0; }

只有大小写啊？if(*p<'z')low++;else lag+;就这样不就好了么

楼主找了好久好久，就是从来没想过自己写作业

1)	统计一个字符串L（只包含大小写英文字母）中各个字符出现的次数； b)	输入：程序CharacterUI.exe生成的Character.data.txt，一行，以char类型写的L。 c)	输出：一个txt文件 1)	第一行一个int，说明一共有多少个字符被统计； 2)	从第二行起，每行记录一个字符的情况，以char,int的方式记录字符和出现次数。 d)	程序CharacterUI.exe生成的Character.test.txt文件为对应Character.data.txt的答案。

哦哦,是用C或者C++都行!


Question: 没时间了，谢谢！（C语言）对一个文本分别进行第一、二、三关键字查询排序

/**  * @file    demo.c  * @brief     */  #include <stdio.h> #include <stdlib.h> #include <string.h>  struct sort_keys {     char key1[80];     char key2[80];     char key3[80]; };   /**   * @brief 查找下一个键值的位置  *   * @param curr 当前键值的位置  * @param flag 标志 1-中文 0-其他  *   * @return 下一个键值的位置  *   * @note  目前只支持GB2312的字符集，假定汉字的第一位为1  */ const char * get_next_key(const char *curr, int flag) {     const unsigned char *next;      next = (const unsigned char *)curr;     if (flag) {         /* 中文 */         for (; *next; ++next) {             if (*next >= 0x80) {                 return (const char *)next;             }         }     } else {         /* 字符 */         for (; *next; ++next) {             if (*next <= 0x7f) {                 return (const char *)next;             }         }     }      return (const char *)next; }    /**   * @brief 字符串分割为键值  *   * @param line 字符串  * @param keys 键值  *   * @return 0-成功 -1-失败  */ int line_to_keys(const char *line, struct sort_keys *keys) {     const char *curr, *next;     size_t len;     int flag;      if ((unsigned char)line[0] >= 0x80) {         flag = 0;     } else {         flag = 1;     }      curr = line;     next = get_next_key(curr, flag);     flag = !flag;     if (*next == '\0') {         strcpy(keys->key1, curr);         strcpy(keys->key2, "");         strcpy(keys->key3, "");         return -1;     } else {         len = next - curr;         memcpy(keys->key1, curr, len);         keys->key1[len] = '\0';     }      curr = next;     next = get_next_key(curr, flag);     flag = !flag;     if (*next == '\0') {         strcpy(keys->key2, curr);         strcpy(keys->key3, "");     } else {         len = next - curr;         memcpy(keys->key2, curr, len);         keys->key2[len] = '\0';         strcpy(keys->key3, next);     }      return 0; }    /**   * @brief 比较函数(用于qsort)  *   * @param v1   * @param v2  *   * @return   *  * @note 参考qsort的说明  */ int comp_keys(const void *v1, const void *v2) {     int ret;     const struct sort_keys *p1, *p2;      p1 = ( const struct sort_keys *)v1;     p2 = ( const struct sort_keys *)v2;      if (p1->key2[0] == '\0' && p2->key2[0] != '\0')         return +1;     if (p1->key2[0] != '\0' && p2->key2[0] == '\0')         return -1;     if (p1->key2[0] == '\0' && p2->key2[0] == '\0')          return strcmp(p1->key1, p2->key1);     if ((ret = strcmp(p1->key1, p2->key1)) != 0)         return ret;     if ((ret = strcmp(p1->key2, p2->key2)) != 0)         return ret;     return strcmp(p1->key3, p2->key3);  }  struct sort_keys keys[1024];  int main(int argc, char *argv[]) {     int i, n;     size_t len;     char line[240];      printf("%s\n", "=====================");      /* 读入文件并分割成3个键值 */     i = 0;     while (fgets(line, sizeof(line), stdin)) {         if ((len = strlen(line)) > 1) {             line[len - 1] = '\0';         }         line_to_keys(line, &keys[i]);         printf("%s%s%s\n", keys[i].key1, keys[i].key2, keys[i].key3);         ++i;     }      printf("%s\n", "=====================");      /* 排序并输出 */     n = i;     qsort(keys, n, sizeof(struct sort_keys), comp_keys);     for (i = 0; i < n; ++i) {         printf("%s%s%s\n", keys[i].key1, keys[i].key2, keys[i].key3);     }           return 0; }  /* ===================== 铜锣湾2#直流充电柜直流系统故障 铜锣湾预告警信号 铜锣湾2#直流充电柜直流系统故障 小雁溪110kV故障录波装置启动 小北口1#主变低后备保护装置通讯故障 小北口1#主变低后备保护装置通讯故障 小北口2#主变差动保护装置通讯故障 小北口1#主变低后备保护装置通讯故障 开封GPS对时装置报警 小北口2#主变差动保护装置通讯故障 白家冲220kV白格栅二回白07备用 220kV湾铜二回湾223开关谐波监测装置越限报警 110kV湾铜二回湾223开关谐波监测装置越限报警 220kV湾铜二回湾223开关谐波监测装置越限报警 110kV湾铜二回湾223开关谐波监测装置越限报警 ===================== 110kV湾铜二回湾223开关谐波监测装置越限报警 110kV湾铜二回湾223开关谐波监测装置越限报警 220kV湾铜二回湾223开关谐波监测装置越限报警 220kV湾铜二回湾223开关谐波监测装置越限报警 白家冲220kV白格栅二回白07备用 开封GPS对时装置报警 铜锣湾2#直流充电柜直流系统故障 铜锣湾2#直流充电柜直流系统故障 小北口1#主变低后备保护装置通讯故障 小北口1#主变低后备保护装置通讯故障 小北口1#主变低后备保护装置通讯故障 小北口2#主变差动保护装置通讯故障 小北口2#主变差动保护装置通讯故障 小雁溪110kV故障录波装置启动 铜锣湾预告警信号 */

想特别感谢一下赵四老师！！ 昨天去单位报道，现在才有空上来回复，抱歉。 赵老师的程序我下去再好好运行，研究研究下，貌似还有点问题，具体的我还会上来咨询的。谢谢！

引用 11 楼 xucong198949 的回复:你是说像扑克牌一样排序？？先黑红梅方，然后按数字再排？？ 要是这样的话可以用基数排序  没，以汉字开头的就以汉字为第一关键字排序，相同的排在一起；以数字开始的同样你数字为关键字排序

参考10楼思路的改进： //1.txt: //铜锣湾2#直流充电柜直流系统故障 //铜锣湾预告警信号 //铜锣湾2#直流充电柜直流系统故障 //小雁溪110kV故障录波装置启动 //小北口1#主变低后备保护装置通讯故障 //小北口1#主变低后备保护装置通讯故障 //小北口2#主变差动保护装置通讯故障 //小北口1#主变低后备保护装置通讯故障 //开封GPS对时装置报警 //小北口2#主变差动保护装置通讯故障 //白家冲220kV白格栅二回白07备用 //220kV湾铜二回湾223开关谐波监测装置越限报警 //110kV湾沚二回湾223开关谐波监测装置越限报警 //220kV湾铜二回湾223开关谐波监测装置越限报警 //110kV湾沚二回湾223开关谐波监测装置越限报警 // //每行开头以汉字开始的则在遇到数字或字母时截止作为第一关键字，如“铜锣湾、小雁溪、小北口、开封..”， //每行开头以数字字母开始的，如"220kv、110kv"亦为第一关键字； //之后以汉字或数字字母间隔取第二、三、……关键字 //每行按所有关键字排序导出到2.txt //同时将关键字内容导出到3.txt //忽略全部是汉字的行 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> #define MAXC 1024  //每行最多字节数 #define MAXL 20000 //最多行数 #define MAXF 20    //每行最多关键字数 #define MAXW 80    //每个关键字最多字节数 #define MAXK 5000  //最多总关键字数 char *ss; int sn; char *kk; unsigned int kn; FILE *f; char ln[MAXC]; char kw[MAXW]; char *p,*q; int i,j,k,L; int isaschz(char *s,int i) {//返回:0asc|1hzq|2hzw     static char *ls=NULL;     static int i1;     static int lr;     int ii;      if (s==ls && i1==i-1) { //      ls=s;         ii=i;         if (0==ls[ii]) {lr=0;return lr;}         switch (lr) {         case 0:             if (ls[ii]<0) lr=1;         break;         case 1:             if (ls[ii]<0 || 0x40<=ls[ii]) lr=2;         break;         case 2:             if (ls[ii]<0) lr=1;             else lr=0;         break;         }         i1=ii;         return lr;     } else {         ls=s;         ii=0;         lr=0;         while (1) {             if (0==ls[ii]) break;             switch (lr) {             case 0:                 if (ls[ii]<0) lr=1;             break;             case 1:                 if (ls[ii]<0 || 0x40<=ls[ii]) lr=2;             break;             case 2:                 if (ls[ii]<0) lr=1;                 else lr=0;             break;             }             if (ii==i) {                 i1=ii;                 return lr;             }             ii++;         }         return lr;     }  } int cmpk(const void *arg1, const void *arg2 ) {     return strcmp((char*)arg1,(char*)arg2); } int cmp(const void *arg1, const void *arg2 ) {     int r,n;     char *p1,*p2;      p1=(char *)arg1;     p2=(char *)arg2;     for (n=0;n<MAXF;n++) {         r=strcmp(p1+n*MAXW,p2+n*MAXW);         if (r) return r;     }     return 0; } int main() {     ss=(char *)calloc(MAXW*MAXF*MAXL,1);     if (NULL==ss) return 1;     kk=(char *)calloc(MAXW*MAXK,1);     if (NULL==kk) {free(ss);return 2;}     f=fopen("1.txt","r");     if (NULL==f) {printf("Can not open file 1.txt!\n");free(kk);free(ss);return 3;}     i=0;     kn=0;     while (1) {         if (NULL==fgets(ln,MAXC,f)) break;         L=strlen(ln)-1;         ln[L]=0;//去掉行尾的'\n'         for (j=0;j<L;j++) if (isaschz(ln,j)==0) break;         if (j<L) {//不全是汉字             k=0;             if (ln[0]>0) {//数字字母开头                 p=ln;                 while (1) {                     j=0;                     while (1) {                         if (isaschz(p,j)) break;                         j++;                     }                     strncpy(ss+i*MAXW*MAXF+k*MAXW,p,__min(MAXW-1,j));                     strncpy(kw                  ,p,__min(MAXW-1,j));kw[__min(MAXW-1,j)]=0;                     _lsearch(kw,kk,&kn,MAXW,cmpk);                     k++;                     if (k>=MAXF) break;                     if (0==p[j]) break;                     p+=j;                     j=0;                     while (1) {                         if (isaschz(p,j)==0) break;                         j++;                     }                     strncpy(ss+i*MAXW*MAXF+k*MAXW,p,__min(MAXW-1,j));                     strncpy(kw                  ,p,__min(MAXW-1,j));kw[__min(MAXW-1,j)]=0;                     _lsearch(kw,kk,&kn,MAXW,cmpk);                     k++;                     if (k>=MAXF) break;                     if (0==p[j]) break;                     p+=j;                 }             } else {//汉字开头                 p=ln;                 while (1) {                     j=0;                     while (1) {                         if (isaschz(p,j)==0) break;                         j++;                     }                     strncpy(ss+i*MAXW*MAXF+k*MAXW,p,__min(MAXW-1,j));                     strncpy(kw                  ,p,__min(MAXW-1,j));kw[__min(MAXW-1,j)]=0;                     _lsearch(kw,kk,&kn,MAXW,cmpk);                     k++;                     if (k>=MAXF) break;                     if (0==p[j]) break;                     p+=j;                     j=0;                     while (1) {                         if (isaschz(p,j)) break;                         j++;                     }                     strncpy(ss+i*MAXW*MAXF+k*MAXW,p,__min(MAXW-1,j));                     strncpy(kw                  ,p,__min(MAXW-1,j));kw[__min(MAXW-1,j)]=0;                     _lsearch(kw,kk,&kn,MAXW,cmpk);                     k++;                     if (k>=MAXF) break;                     if (0==p[j]) break;                     p+=j;                 }             }             i++;             if (i>=MAXL) {printf("Warning:>%d lines is ignored.\n",MAXL); break;}         }     }     fclose(f);     sn=i;     qsort(ss,sn,MAXW*MAXF,cmp);     f=fopen("2.txt","w");     for (i=0;i<sn;i++) {         k=0;         while (1) {             if (0==(ss+i*MAXW*MAXF+k*MAXW)[0]) break;             fprintf(f,"%s",ss+i*MAXW*MAXF+k*MAXW);             k++;         }         fprintf(f,"\n");     }     fclose(f);     f=fopen("3.txt","w");     for (i=0;i<(int)kn;i++) {         fprintf(f,"%s\n",kk+i*MAXW);     }     fclose(f);     free(kk);     free(ss);     return 0; } //2.txt: //110kV湾沚二回湾223开关谐波监测装置越限报警 //110kV湾沚二回湾223开关谐波监测装置越限报警 //220kV湾铜二回湾223开关谐波监测装置越限报警 //220kV湾铜二回湾223开关谐波监测装置越限报警 //白家冲220kV白格栅二回白07备用 //开封GPS对时装置报警 //铜锣湾2#直流充电柜直流系统故障 //铜锣湾2#直流充电柜直流系统故障 //小北口1#主变低后备保护装置通讯故障 //小北口1#主变低后备保护装置通讯故障 //小北口1#主变低后备保护装置通讯故障 //小北口2#主变差动保护装置通讯故障 //小北口2#主变差动保护装置通讯故障 //小雁溪110kV故障录波装置启动 // //3.txt: //铜锣湾 //2# //直流充电柜直流系统故障 //小雁溪 //110kV //故障录波装置启动 //小北口 //1# //主变低后备保护装置通讯故障 //主变差动保护装置通讯故障 //开封 //GPS //对时装置报警 //白家冲 //220kV //白格栅二回白 //07 //备用 //湾铜二回湾 //223 //开关谐波监测装置越限报警 //湾沚二回湾 //

以上3.txt最后三行是因为 湾沚二回湾 中的“沚”字的后半字节为0x61被误判为'b'。  想要纠正此问题，请相应修改判断该字节是否为数字字母或汉字的语句 if (p[j]>=0) break; 和 if (p[j]<=0) break;  思路为从本行的第一个字节开始记录当前字节为： 汉字的前半个字节 汉字的后半个字节 数字或字母 三者之一。 参考下面：    //GBK汉字内码范围（不包括A1xx～A9xx的标点符号英文字母特殊符号等）    //区码  ,位码    //81-A0 ,40-7E 80-FE    //AA-AF ,40-7E 80-A0    //B0-D6 ,40-7E 80-FE    //D7    ,40-7E 80-F9    //D8-F7 ,40-7E 80-FE    //F8-FE ,40-7E 80-A0

这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。  //1.txt: //铜锣湾2#直流充电柜直流系统故障 //铜锣湾预告警信号 //铜锣湾2#直流充电柜直流系统故障 //小雁溪110kV故障录波装置启动 //小北口1#主变低后备保护装置通讯故障 //小北口1#主变低后备保护装置通讯故障 //小北口2#主变差动保护装置通讯故障 //小北口1#主变低后备保护装置通讯故障 //开封GPS对时装置报警 //小北口2#主变差动保护装置通讯故障 //白家冲220kV白格栅二回白07备用 //220kV湾铜二回湾223开关谐波监测装置越限报警 //110kV湾沚二回湾223开关谐波监测装置越限报警 //220kV湾铜二回湾223开关谐波监测装置越限报警 //110kV湾沚二回湾223开关谐波监测装置越限报警 // //每行开头以汉字开始的则在遇到数字或字母时截止作为第一关键字，如“铜锣湾、小雁溪、小北口、开封..”， //每行开头以数字字母开始的，如"220kv、110kv"亦为第一关键字； //之后以汉字或数字字母间隔取第二、三、……关键字 //每行按所有关键字排序导出到2.txt //同时将关键字内容导出到3.txt //忽略全部是汉字的行 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> #define MAXC 1024  //每行最多字节数 #define MAXL 20000 //最多行数 #define MAXF 20    //每行最多关键字数 #define MAXW 80    //每个关键字最多字节数 #define MAXK 5000  //最多总关键字数 char *ss; int sn; char *kk; unsigned int kn; FILE *f; char ln[MAXC]; char kw[MAXW]; char *p,*q; int i,j,k,L; int cmpk(const void *arg1, const void *arg2 ) {     return strcmp((char*)arg1,(char*)arg2); } int cmp(const void *arg1, const void *arg2 ) {     int r,n;     char *p1,*p2;      p1=(char *)arg1;     p2=(char *)arg2;     for (n=0;n<MAXF;n++) {         r=strcmp(p1+n*MAXW,p2+n*MAXW);         if (r) return r;     }     return 0; } int main() {     ss=(char *)calloc(MAXW*MAXF*MAXL,1);     if (NULL==ss) return 1;     kk=(char *)calloc(MAXW*MAXK,1);     if (NULL==kk) {free(ss);return 2;}     f=fopen("1.txt","r");     if (NULL==f) {printf("Can not open file 1.txt!\n");free(kk);free(ss);return 3;}     i=0;     kn=0;     while (1) {         if (NULL==fgets(ln,MAXC,f)) break;         L=strlen(ln)-1;         ln[L]=0;//去掉行尾的'\n'         for (j=0;j<L;j++) if (ln[j]>0) break;         if (j<L) {//不全是汉字             k=0;             if (ln[0]>0) {//数字字母开头                 p=ln;                 while (1) {                     j=0;                     while (1) {                         if (p[j]<=0) break;                         j++;                     }                     strncpy(ss+i*MAXW*MAXF+k*MAXW,p,__min(MAXW-1,j));                     strncpy(kw                  ,p,__min(MAXW-1,j));kw[__min(MAXW-1,j)]=0;                     _lsearch(kw,kk,&kn,MAXW,cmpk);                     k++;                     if (k>=MAXF) break;                     if (0==p[j]) break;                     p+=j;                     j=0;                     while (1) {                         if (p[j]>=0) break;                         j++;                     }                     strncpy(ss+i*MAXW*MAXF+k*MAXW,p,__min(MAXW-1,j));                     strncpy(kw                  ,p,__min(MAXW-1,j));kw[__min(MAXW-1,j)]=0;                     _lsearch(kw,kk,&kn,MAXW,cmpk);                     k++;                     if (k>=MAXF) break;                     if (0==p[j]) break; 					p+=j;                 }             } else {//汉字开头                 p=ln;                 while (1) {                     j=0;                     while (1) {                         if (p[j]>=0) break;                         j++;                     }                     strncpy(ss+i*MAXW*MAXF+k*MAXW,p,__min(MAXW-1,j));                     strncpy(kw                  ,p,__min(MAXW-1,j));kw[__min(MAXW-1,j)]=0;                     _lsearch(kw,kk,&kn,MAXW,cmpk);                     k++;                     if (k>=MAXF) break;                     if (0==p[j]) break;                     p+=j;                     j=0;                     while (1) {                         if (p[j]<=0) break;                         j++;                     }                     strncpy(ss+i*MAXW*MAXF+k*MAXW,p,__min(MAXW-1,j));                     strncpy(kw                  ,p,__min(MAXW-1,j));kw[__min(MAXW-1,j)]=0;                     _lsearch(kw,kk,&kn,MAXW,cmpk);                     k++;                     if (k>=MAXF) break;                     if (0==p[j]) break;                     p+=j;                 }             }             i++;             if (i>=MAXL) {printf("Warning:>%d lines is ignored.\n",MAXL); break;}         }     }     fclose(f);     sn=i;     qsort(ss,sn,MAXW*MAXF,cmp);     f=fopen("2.txt","w");     for (i=0;i<sn;i++) {         k=0;         while (1) {             if (0==(ss+i*MAXW*MAXF+k*MAXW)[0]) break;             fprintf(f,"%s",ss+i*MAXW*MAXF+k*MAXW);             k++;         }         fprintf(f,"\n");     }     fclose(f);     f=fopen("3.txt","w");     for (i=0;i<(int)kn;i++) {         fprintf(f,"%s\n",kk+i*MAXW);     }     fclose(f);     free(kk);     free(ss);     return 0; } //2.txt: //110kV湾沚二回湾223开关谐波监测装置越限报警 //110kV湾沚二回湾223开关谐波监测装置越限报警 //220kV湾铜二回湾223开关谐波监测装置越限报警 //220kV湾铜二回湾223开关谐波监测装置越限报警 //白家冲220kV白格栅二回白07备用 //开封GPS对时装置报警 //铜锣湾2#直流充电柜直流系统故障 //铜锣湾2#直流充电柜直流系统故障 //小北口1#主变低后备保护装置通讯故障 //小北口1#主变低后备保护装置通讯故障 //小北口1#主变低后备保护装置通讯故障 //小北口2#主变差动保护装置通讯故障 //小北口2#主变差动保护装置通讯故障 //小雁溪110kV故障录波装置启动  //3.txt: //铜锣湾 //2# //直流充电柜直流系统故障 //小雁溪 //110kV //故障录波装置启动 //小北口 //1# //主变低后备保护装置通讯故障 //主变差动保护装置通讯故障 //开封 //GPS //对时装置报警 //白家冲 //220kV //白格栅二回白 //07 //备用 //湾铜二回湾 //223 //开关谐波监测装置越限报警 //湾? //b //二回湾

引用 6 楼 mujiok2003 的回复:excel两分钟搞定 关键是不能用，可惜这个了

引用 5 楼 zxhuser-5 的回复:[quote=引用 4 楼 xcg88 的回复:] 求各位大神老师帮帮忙，给点意见也可以。     回zxhuser-5：你给的参考程序不知道咋用。。。先按学校排序，然后按班级排序，最后按成绩排序[/quote]  谢谢你，我回去看看哈！

excel两分钟搞定

引用 4 楼 xcg88 的回复:求各位大神老师帮帮忙，给点意见也可以。     回zxhuser-5：你给的参考程序不知道咋用。。。先按学校排序，然后按班级排序，最后按成绩排序

各位帮帮忙...

谢谢，不是说分三段，应该说是对这个文本进行三次的遍历排序，更加精确的把相同的部分归结为一起。 按第一个关键字排序； 然后对排序后的文本进行第二个关键字排序如下面的  第一个关键字排序后： 小北口1#主变低后备保护装置通讯故障 小北口1#主变低后备保护装置通讯故障 小北口2#主变差动保护装置通讯故障 小北口1#主变低后备保护装置通讯故障 铜锣湾2#直流充电柜直流系统故障 铜锣湾预告警信号 铜锣湾2#直流充电柜直流系统故障 第二个关键字排序后为： 小北口1#主变低后备保护装置通讯故障 小北口1#主变低后备保护装置通讯故障 小北口1#主变低后备保护装置通讯故障 小北口2#主变差动保护装置通讯故障 铜锣湾2#直流充电柜直流系统故障 铜锣湾2#直流充电柜直流系统故障 铜锣湾预告警信号

题目意思是将每条记录分为三段然后排序？ 参考代码：http://pan.baidu.com/s/1ntuNH0X


Question: C语言连接sqlserver数据库，非MFC哦

引用 5 楼 oZaiYue 的回复:[quote=引用 2 楼 mujiok2003 的回复:] ADO, 是COM的。 试试ODBC 那个，大哥，能铺一段代码看看吗？对代码比较敏感[/quote]  msdn有很多odbc的代码呀， 自己动手编译一下嘛

引用 5 楼 oZaiYue 的回复:[quote=引用 2 楼 mujiok2003 的回复:] ADO, 是COM的。 试试ODBC 那个，大哥，能铺一段代码看看吗？对代码比较敏感[/quote]  没有时间写啊

引用 3 楼 user-4 的回复:换Mysql 或sqllite吧，它们有C接口的API 大哥，弄一段代码吧，看着比较清晰，谢谢您了

引用 2 楼 mujiok2003 的回复:ADO, 是COM的。 试试ODBC 那个，大哥，能铺一段代码看看吗？对代码比较敏感

ADO, 是COM的。 试试ODBC

未检查返回值 #include <Windows.h>    #include <sqlext.h> //#include <sql.h>    //#include <sqltypes.h> #include <stdio.h>     #pragma comment(lib, "ODBC32.lib")    #define MAXNAME 100   SQLHENV  henv   = SQL_NULL_HENV;    SQLHDBC  hdbc1  = SQL_NULL_HDBC;    SQLHSTMT hstmt1 = SQL_NULL_HSTMT;     int main(void)    {       RETCODE retcode;       char szDSN[SQL_MAX_DSN_LENGTH + 1] = "Northwind",   //必须是一个合法的DSN Name            szUID[MAXNAME]                = "",            //用户名            szAuthStr[MAXNAME]            = "";            //用户密码               retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);       retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);    /*连接到数据源,需要到控制面板->管理工具->数据源(ODBC)中添加数据源*/    retcode = SQLConnect(hdbc1,                            (SQLCHAR *)szDSN,                            (SWORD)strlen(szDSN),                            (SQLCHAR *)szUID,                            (SWORD)strlen(szUID),                            (SQLCHAR *)szAuthStr,                            (SWORD)strlen(szAuthStr));        if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))          printf("Connection Error.\n");       else          printf("Connection Successfully.\n");              //连接成功,你可以操作数据库了       retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);               SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);    SQLDisconnect(hdbc1);       SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);       SQLFreeHandle(SQL_HANDLE_ENV, henv);        return 0;   }

引用 楼主 oZaiYue 的回复:哪位大神能提供一下C语言连接数据库的办法，最好用ADO，网上一搜全部是MFC的，我比较小白，想要那种最好是控制台程序的，纯C语言连接数据库的。  有sql的库啊

换Mysql 或sqllite吧，它们有C接口的API


Question: 如何进行整个结构体的赋值操作？

糊涂啊。

struct a, b; //假设b已经有有效值 a = b; 整体赋值完成 后果自己仔细掂量

struct S {  int i;  double d; } s1,s2; s1.i=1; s1.d=2.3; s2=s1; printf("s2.i==%d,s2.d==%lg\n",s2.i,s2.d);

8楼正解 结构就是这么的方便

引用 1 楼 user-10 的回复:需要Copy么？直接等就行了。 默认的赋值函数就是内存拷贝，memcpy 正解，里面又没有指向堆地址的指针，不需要深拷贝，浅拷贝就行了；

啥叫temp一直处于失效的状态？

struct User { 	char ID[20]; 	char password[100]; 	char name[20]; 	int sex; 	int age; 	static int count; 	void copy(struct User temp) 	{ 		strcpy(ID,temp.ID); 		strcpy(password,temp.password); 		strcpy(name,temp.name); 		sex=temp.sex; 		age=temp.age; 	} }user[1000];//结构体部分  user[count].copy(user_temp);//调用的语句，目的是把user_temp里的内容复制到user[count]里边去。   这样改行吗？

POD数据，直接=就可以了吧。编译器生成的默认的copy函数就可以完成工作了。

如果用strcpy那么，src必须是由'\0'结尾的。

需要Copy么？直接等就行了。 默认的赋值函数就是内存拷贝，memcpy


Question: 笔试题  船靠岸

绳子的高度和人一样呢，这样还构成一个长方形了，绳子长度和船的距离是一样的了  引用 3 楼 Intel0011 的回复:[quote=引用 楼主 u012538549 的回复:]            一道程序猿笔试题     在一个平静的湖中有一条小船，湖岸边立着一条木杆，木杆上头系一根绳子，绳子另一头拉在船夫手上，船夫不断拉动绳子，船不断靠近岸边，最终船达到木杆跟前，问：在这个过程中，船的移动速度与绳子在人手上的移动速度哪个快？（说出简单的数学原理）        （ 百度百科上给去了绳子快的答案 ）  将木杆、船到木杆的距离、绳子视为一个直角三角形，木杆、船到木杆的距离为直角边，绳子为直角三角形的斜边， 利用直角三角形的斜边 大于直角三角形的直角边的原理，在时间相等的情况下，很显然绳子在人手上的移动速度的更快[/quote]

引用 楼主 u012538549 的回复:一道程序猿笔试题     在一个平静的湖中有一条小船，湖岸边立着一条木杆，木杆上头系一根绳子，绳子另一头拉在船夫手上，船夫不断拉动绳子，船不断靠近岸边，最终船达到木杆跟前，问：在这个过程中，船的移动速度与绳子在人手上的移动速度哪个快？（说出简单的数学原理）        （ 百度百科上给去了绳子快的答案 ）  将木杆、船到木杆的距离、绳子视为一个直角三角形，木杆、船到木杆的距离为直角边，绳子为直角三角形的斜边， 利用直角三角形的斜边 大于直角三角形的直角边的原理，在时间相等的情况下，很显然绳子在人手上的移动速度的更快

应该是手上的速度快。原理应该是速度的矢量和。

那要看拉的人用什么角度。。

引用 6 楼 u012538549 的回复:我分析得到船速快于绳子速度    问过很多程秀员   全部都是认为绳子速度快于船速（没有一个认为船速大于绳子速度的）               3楼分析模型三角形    船走了一个直角三角形底边    绳子走了一个斜边减掉一个杆长的长度（不是一个斜边）     而三角形中一条边减除另一条边小于第三边            （我问过的程序猿全军覆没    一道高中受力分析题）  呵呵，有点道理

引用 6 楼 u012538549 的回复:我分析得到船速快于绳子速度    问过很多程秀员   全部都是认为绳子速度快于船速（没有一个认为船速大于绳子速度的）               3楼分析模型三角形    船走了一个直角三角形底边    绳子走了一个斜边减掉一个杆长的长度（不是一个斜边）     而三角形中一条边减除另一条边小于第三边            （我问过的程序猿全军覆没    一道高中受力分析题） 有道理，漏了这一因素

这不是数学题，这是物理题

有两种答案，第一种是一样快，第二种是绳子快。这个答案要看题目的具体的图形才知道


引用 1 楼 zmlovelx 的回复:估计是把到exit(0) 那句去了。 程序自己退出  没有走exit(0)，走得是下面的else，*x也是一个正常的int值，很奇怪。

却是是运行完了就退出了  并没有什么其他的问题

估计是把到exit(0) 那句去了。 程序自己退出


Question: 单链表字符串输入，还要实现增删改查！急急急！求解！

一楼正解，结贴！

哥们  直接遍历 它的数据域就可以了撒，搞那么麻烦还不如使用 STL 中的容器更爽，STL就是对数据结构的封装

嗯嗯，代码写的很详细，这些我基本都实现了，现在的问题是，所有的数据要用字符串输入并打印出来，每一次的增删改查实现的同时，打印出相对应的结果（链表存放的数据是字符串），求指点啊！！！

#include <stdio.h>  #include <stdlib.h>     typedef int ElemType;  ////////////////////////////////////////////      //定义结点类型   typedef struct Node  {      ElemType data;              //单链表中的数据域       struct Node *next;          //单链表的指针域   }Node,*LinkedList;     ////////////////////////////////////////////      //单链表的初始化     LinkedList LinkedListInit()  {      Node *L;      L = (Node *)malloc(sizeof(Node));   //申请结点空间       if(L == NULL)                       //判断是否有足够的内存空间           printf("申请内存空间失败\n");      L->next = NULL;                  //将next设置为NULL,初始长度为0的单链表   }     ////////////////////////////////////////////      //单链表的建立1，头插法建立单链表     LinkedList LinkedListCreatH()  {      Node *L;      L = (Node *)malloc(sizeof(Node));   //申请头结点空间      L->next = NULL;                      //初始化一个空链表             ElemType x;                         //x为链表数据域中的数据      while(scanf("%d",&x) != EOF)      {          Node *p;          p = (Node *)malloc(sizeof(Node));   //申请新的结点           p->data = x;                     //结点数据域赋值           p->next = L->next;                    //将结点插入到表头L-->|2|-->|1|-->NULL           L->next = p;       }      return L;   }      ////////////////////////////////////////////      //单链表的建立2，尾插法建立单链表     LinkedList LinkedListCreatT()  {      Node *L;      L = (Node *)malloc(sizeof(Node));   //申请头结点空间      L->next = NULL;                  //初始化一个空链表      Node *r;      r = L;                          //r始终指向终端结点，开始时指向头结点       ElemType x;                         //x为链表数据域中的数据      while(scanf("%d",&x) != EOF)      {          Node *p;          p = (Node *)malloc(sizeof(Node));   //申请新的结点           p->data = x;                     //结点数据域赋值           r->next = p;                 //将结点插入到表头L-->|1|-->|2|-->NULL           r = p;       }      r->next = NULL;              return L;     }     ////////////////////////////////////////////      //单链表的插入，在链表的第i个位置插入x的元素     LinkedList LinkedListInsert(LinkedList L,int i,ElemType x)  {      Node *pre;                      //pre为前驱结点       pre = L;      int tempi = 0;      for (tempi = 1; tempi < i; tempi++)          pre = pre->next;                 //查找第i个位置的前驱结点       Node *p;                                //插入的结点为p      p = (Node *)malloc(sizeof(Node));      p->data = x;       p->next = pre->next;      pre->next = p;             return L;                             }      ////////////////////////////////////////////      //单链表的删除，在链表中删除值为x的元素     LinkedList LinkedListDelete(LinkedList L,ElemType x)  {      Node *p,*pre;                   //pre为前驱结点，p为查找的结点。       p = L->next;      while(p->data != x)              //查找值为x的元素       {             pre = p;           p = p->next;      }      pre->next = p->next;          //删除操作，将其前驱next指向其后继。       free(p);      return L;  }      /////////////////////////////////////////////     int main()  {      LinkedList list,start;  /*  printf("请输入单链表的数据：");       list = LinkedListCreatH();      for(start = list->next; start != NULL; start = start->next)          printf("%d ",start->data);      printf("\n");  */  printf("请输入单链表的数据：");       list = LinkedListCreatT();      for(start = list->next; start != NULL; start = start->next)          printf("%d ",start->data);      printf("\n");         int i;      ElemType x;      printf("请输入插入数据的位置：");      scanf("%d",&i);      printf("请输入插入数据的值：");      scanf("%d",&x);      LinkedListInsert(list,i,x);      for(start = list->next; start != NULL; start = start->next)          printf("%d ",start->data);      printf("\n");      printf("请输入要删除的元素的值：");      scanf("%d",&x);      LinkedListDelete(list,x);       for(start = list->next; start != NULL; start = start->next)          printf("%d ",start->data);      printf("\n");             return 0;  }


Question: 各位大神求教一个计算斜率，进行标定的奇葩问题，一直编译通不过啊。

果然是编译器的问题，在build 选项的global里设置float ，和double 项为32bit就好了，这编译器居然默认double为24bit，真是奇葩.分全给你了，谢谢啦！

你看一下编译选项，有没有关于double长度的设置。还有就是h不判断吗？为０情况不考虑？

还是不行

RAM_Data.k[i]= (double)( (double)k/(double)h );

这个问题其实不太好搞啊

RAM_Data.k[i]= ( (double)k/(double)h );改掉    什么意思？

你没把(u32)去掉。

u32 k, h; for(i = 0 ; i < 5 ; i++ )     {            k = (RAM_Data.Calibration_Data_In_Order[i+1].Pressure - RAM_Data.Calibration_Data_In_Order[i].Pressure);         h = (RAM_Data.Calibration_Data_In_Order[i+1].AD_Outcome - RAM_Data.Calibration_Data_In_Order[i].AD_Outcome);         RAM_Data.k[i]= (double)k/(double)h ;      }

还是老样子

RAM_Data.k[i]= ( (double)k/(double)h );改掉。

貌似还是不行哎。

上面的floast要去掉。

把结构体Data_Save_IN_Flash 里面的k[6] 改成double类型  for(i = 0 ; i < 5 ; i++ )     {            k = (float)(RAM_Data.Calibration_Data_In_Order[i+1].Pressure - RAM_Data.Calibration_Data_In_Order[i].Pressure);         h = (float)(RAM_Data.Calibration_Data_In_Order[i+1].AD_Outcome - RAM_Data.Calibration_Data_In_Order[i].AD_Outcome);         RAM_Data.k[i]= ( (double)k/(double)h );      }

要是弄好了，分就全给你啦。

关键的没有帖出来，包含Pressure 这个词的结构没有贴出来。 这个问题很好调的。

额，RAM_Data.k[i]   定义成double又回到那个无法生成代码的错误上了，将它定义为u32时候可以的。

那没事啊，那你定义成double就可以了。double肯定是３２位的。

谢谢啦，不过虽然编译是通过了，这样的话    RAM_Data.k[i]   就要定义成u32    ，我原来定义的float，因为是计算两点间标定斜率，定义成u32会损失很多精度啊。

上面的float去掉。


Question: swap 指针问题请教

传值调用与传址调用的区别

swap(int x,int y){     int temp;     temp=x;     x=y;     y=temp; }  swap(m, n); 只是将m, n的副本, 在此函数内部互换下。 实参m， n 并没有变化。  只能用指针， void swap(int *x,int *y)；实现。 指针值的也没有变化， 改变的是指针所指的内存的内容。。

为什么问来问去总是这些问题。。这个网上一搜都到处都是了吧

调用函数时，会把所有参数变量复制到函数中，不管你怎么修改函数里面的那个变量，和调用该函数时传给这个函数的变量没有关系 用指针可以修改内存，把函数外的指针复制到函数里，两个指针依然指向同一块内存，也就是同一个变量，所以修改函数里面的那个指针指向的变量，也就等于修改函数外面的那个指针指向的变量

大部分语言都有按值传参，按引用传参的区别

你要交换int,参数用int* 你要交换int*,参数用int** 你要交换T, 参数用T*

此外还有：      /* * swap - swap value of @a and @b   */  #define swap(a, b) \         do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)   我觉得看明白这些就可以

http://bbs.csdn.net/topics/350206749  #include <iostream> using namespace std; /*为了便于区分讲解，函数中的临时参数标识符不用void fun1(int x,int y)代码中的x，y而用a与b替换 *另外，程序解释不用太多的语法，用通俗的话语依旧可以很有趣。“千言万语不如一个好例子”。下面 *我就遵循这个原则去解释我对问题的理解。 */  /*fun1中的参数ab是在函数fun1调用的时候才分配内存单元，也就是临时变量，在函数调用结束后 *自动销毁。当调用fun1(x,y)时，实际相当于fun1(int a=x,int b=y)或者fun1(int a=*x0,int b=*y0); *因此ab有自己的内存，通过调用ab也有了自己的值，那么在函数中无论对ab的什么操作，都只影响到ab， *而与xy无关。 *用一个比喻更好解释：假设我国要引进俄国某个机型的战斗机生产线，那么通过政府(main())批准审核投资 *这个生产线就建造成了（fun1（））;那么这个生产线与俄国内的同样的生产线之间是相互独立的 *（ab与xy的区别），唯一的联系是：通过政府(main())出钱购买他们的技术或者设配（调用，同时a=x,b=y） *经过这样之后，我们无论在这个生产线上造什么牛逼的歼十，十一。都与俄国本部的生产线无关了，他们关不 *着也问不着！ */ void fun1(int a,int b) {//这个函数交换数值是:治标不治本     int tem;     tem=a;     a=b;     b=tem;     cout<<"fun1(int a,int b):a="<<a<<",b="<<b<<endl; }  /*fun2数值的交换效果依旧是治标不治本。而且要注意它与fun3的区别，虽然它们形参格式相同 *临时开辟三个临时指针，a、b、tem。同样三者都是局部变量，与函数“老大”“同年同月同日同时生” *而且“同年同月同日同时死”（很像三国的桃园三结义，都是忠诚的卫士）。fun2中的指针ab存储的 *是x，y的地址，等价于fun2(int *a=&x,int *b=&y)或者fun2(int *a=x0,int *b=y0)；fun2中的代码 *实现的是把指针ab存的地址值交换一下，实质是交换了ab指针的指向，因此ab存储的地址中存储 *值还是没有改变。而且也不影响外界指针x0y0的指向,在fun7中会看到与不同 *可以通过fun2中注释掉的语句验证一下 */ void fun2(int *a,int *b) {     //cout<<"a存的地址值"<<a<<"\nb存的地址值"<<b<<endl;     //cout<<"a指向的值"<<*a<<"\nb指向的值"<<*b<<endl;     int *tem;     tem=a;     a=b;     b=tem;     cout<<"fun2(int *a,int *b):*a="<<*a<<",*b="<<*b<<endl;     //cout<<"a存的地址值"<<a<<"\nb存的地址值"<<b<<endl;     //cout<<"a指向的值"<<*a<<"\nb指向的值"<<*b<<endl; }    /*fun3交换数值的效果才算治本了！ *局部变量问题不再解释。通过临时指针ab中存储的地址，找到真正要交换的xy值，然后把他们交换了！ *公安局喜欢这样干活，他们总是不能直接找到犯罪主谋，但是他们会找到一些知道主谋线索的其他非主谋 *嫌疑犯，那么通过抓住他们然后用刑折磨，这要比直接找主谋要容易些，当然这样做有些曲折（绕弯）！但也很有效 *同理，假设你在家里建一个小金库（这里的xy），那么你要设置好自己的密码（xy的地址），然后死死地 *记在脑海（指针）中。每当想打开看看让自己踏实些，你就要从脑海中找到这个密码然后打开它。然而技术 *在飞跃，假设已有《盗梦空间》中的技术，我想改变你的意念（fun3）或者从梦中偷你的思想或者秘密 *接下来的情节会更精彩... */ void fun3(int *a,int *b) {     int tem;     tem=*a;     *a=*b;     *b=tem;     cout<<"fun3(int *a,int *b):*a="<<*a<<",*b="<<*b<<endl; }   /*fun4表述的是“引用” *引用的通俗解释：相当于一个人有多个名字或者外号一样。无论你叫他哪个名字，他都应。 *因此引用很像：一个变量有多个标识符（这样说稍微有些不当）。如果a是变量b的引用，那么ab是同一对象 *通过调用fun4(x,y)或者fun4(*x0,*y0).那么临时变量ab分别是xy与*x0与*y0的引用了。对ab操作就相当于在 *main中直接操作xy */ void fun4(int &a,int &b) {     int tem;     tem=a;     a=b;     b=tem;     cout<<"fun4(int &a,int &b):a="<<a<<",b="<<b<<endl; }   /*fun5参数采用指向指针的指针，这比fun2，fun3还要绕弯子，但这里依旧要注意fun5与fun7的区别 *fun5依旧治标不治本，fun6才能治本，他们实质和fun2与fun3类似，只不过比它们要多一层指针 *既然多一层指针那么在调用的时候传递的实参就必须是指针的地址，而不能是别的。等价于 *fun5(int **a=&x0,int **b=&y0) *换用上面的比喻：相当于在《盗梦空间》里进入第二层梦里偷意念了。c++里没有拓展到第三，四层梦里 *去偷东西！也就是没有***a或者*****a。因为两层处理的很好了！ */ void fun5(int **a,int **b) {     int **tem;     tem=a;     a=b;     b=tem;     cout<<"fun5(int **a,int **b):**a="<<**a<<",**b="<<**b<<endl; }   /*fun6和fun3有相同的实质，只是多一层指针 */ void fun6(int **a,int **b) {     int tem;     tem=**a;     **a=**b;     **b=tem;     cout<<"fun6(int **a,int **b):**a="<<**a<<",**b="<<**b<<endl; }  /*fun7实现与fun2不同效果，上面我已经提到了。 *fun2结果是函数内部的交换不会影响到外面指针的指向，但是这里不同了，fun7函数实现了指针x0y0 *指向的交换。但却没有影响到xy的值的交换。就因为多了一个“引用（&）”。而fun2中是开辟的临时指针变量 *明白引用就能明白这里的效果。 */ void fun7(int *&a,int *&b) {     int *tem;     tem=a;     a=b;     b=tem;     cout<<"fun7(int *&a,int *&b):*a="<<*a<<",*b="<<*b<<endl; }  /*这里达到的效果同fun3，二者一定程度上可以互相替换，只不过调用时有些区别！ */ void fun8(int *&a,int *&b) {     int tem;     tem=*a;     *a=*b;     *b=tem;     cout<<"fun8(int *&a,int *&b):*a="<<*a<<",*b="<<*b<<endl; } int main() {     int x=13,*x0=&x,&x1=x;     int y=250,*y0=&y,&y1=y;      cout<<"\n调用前main():x="<<x<<",y="<<y<<endl;     fun1(x,y);     cout<<"调用后main():x="<<x<<",y="<<y<<endl;      //fun1(&x,&y);//错误      cout<<"\n调用前main():*x0="<<*x0<<",*y0="<<*y0<<endl;     fun1(*x0,*y0);//这与上面的fun1调用没有区别     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;        cout<<"\n调用前main():*x0="<<*x0<<",*y0="<<*y0<<endl;     fun2(x0,y0);//把指针的地址传递过去，     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;      cout<<"\n调用前main():x="<<x<<",y="<<y<<endl;     fun2(&x,&y);//把指针的地址的副本传递过去（按值传递），依旧不会影响原来的指针x0y0的指向     cout<<"调用后main():x="<<x<<",y="<<y<<endl;        cout<<"\n调用前main():*x0="<<*x0<<",*y0="<<*y0<<endl;     fun3(x0,y0);     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;     cout<<"调用后main():x="<<x<<",y="<<y<<endl;      cout<<"\n调用前main():x="<<x<<",y="<<y<<endl;     fun3(&x,&y);     cout<<"调用后main():x="<<x<<",y="<<y<<endl;     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;        cout<<"\n调用前main():x="<<x<<",y="<<y<<endl;     fun4(x,y);     cout<<"调用后main():x="<<x<<",y="<<y<<endl;      cout<<"\n调用前main():*x0="<<*x0<<",*y0="<<*y0<<endl;     fun4(*x0,*y0);     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;       //fun5(&x,&y);//错误      cout<<"\n调用前main():x="<<x<<",y="<<y<<endl;     fun5(&x0,&y0);     cout<<"调用后main():x="<<x<<",y="<<y<<endl;     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;      cout<<"\n调用前main():*x0="<<*x0<<",*y0="<<*y0<<endl;     fun6(&x0,&y0);     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;     cout<<"调用后main():x="<<x<<",y="<<y<<endl;   //这里之所以把fun8调用放在fun7之前，是因为如果fun7在fun8前，那么fun7调用后x0指向y,y0指向x, //再调用fun8得到的结果不便于理解。     cout<<"\n调用前main():*x0="<<*x0<<",*y0="<<*y0<<endl;     fun8(x0,y0);     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;     cout<<"调用后main():x="<<x<<",y="<<y<<endl;        cout<<"\n调用前main():*x0="<<*x0<<",*y0="<<*y0<<endl;     fun7(x0,y0);     cout<<"调用后main():*x0="<<*x0<<",*y0="<<*y0<<endl;     cout<<"调用后main():x="<<x<<",y="<<y<<endl;      //fun7(&x,&y);//错误     system("pause");    return 0; }

#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2


Question: 命令行参数解析问题

真的是这样，有点令人费解哦

引用 楼主 ho509ho 的回复:编译运行后结果如下： [root@node0 Linux-C]# ./a.out -i -lr 'hi there' -f args.c -q 问题是： 在for循环中，为什么通过optind变量打印的是字符串‘hi there'  参数换成：[root@node0 Linux-C]# ./a.out -i -lr “hi there” -f args.c -q 要用双引号

取每个参数的时候是这样取的啊。  #include<stdio.h> int main(int argc, char *argv[])  { 	int i; 	for(i=0; i<argc; i++) 	{ 		puts(argv[i]); 	} 	return 0; }

man 3 getopt  查看getopt函数的说明


Question: printf 与stdout行缓冲问题求解

引用 5 楼 mujiok2003 的回复:这个问题和你的一样，看看吧。 看来标准没有规定，就看所用的编译器了。   引用 1 楼 user-3 的回复:1，第一段代码，完全可能是有正常输出的。如果谁跟你说的有缓冲区就不输出了，去吐他一脸去 2，C++才规定了stdin的时候默认一定要去先刷新stdout，标准的规定。C99有没有在C++标准出来后跟进这个规定，自己去查标准。 3，自己多找几个编译器来试。 用turbo c用printf("dd>");while(1); 是有输出的。gcc就没有了。 感谢^_^

这个问题和你的一样，看看吧。

引用 3 楼 colddown 的回复:逻辑上stdin前先刷stdout是合理的，用户得看到输出提示才能知道输入什么  在stdin, stdout指向同一个终端时，是的。 如果有重定向， 则没有必要。

逻辑上stdin前先刷stdout是合理的，用户得看到输出提示才能知道输入什么

4，这是一个没有实际用途的话题，别在上面浪费太多生命。


Question: 请问，这一小段运行段错误，问题在哪

**a = '1'; *(*a+1)='2'; 这样就可以了，**(a+1)是野指针，不能赋值。

进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

#include <stdio.h> #include <stdlib.h> #include <string.h>   void stringtest(char **a) { 	*a = (char*)malloc(sizeof(char)*100);   //把*a  理解为 主函数里面的t指针 	*(*a+0) = '1'; 	*(*a + 1) = '2'; 	*(*a + 2)  = 0; 	printf("function:%s\n",*a);    	/* 	char *t = (char*)malloc(sizeof(char)*100);  	*(t+0)='1'; 	*(t+1)='2'; 	*(t+2)=0;  字符串记得加个ASCII 的0结尾  一般写成  '\0' 	*/   }  int main(void) {  	char * t; 	stringtest(&t);  	printf("main:%s\n",t); 	return 0; }

段错误——内存访问错误！**(a+1)非法

引用 3 楼 jia_jianlei 的回复:应该用*((*a)+1) = '2'; **（a+1) = '2';//表示将a+4地址变为一个二级指针，会非法访问内存。 a为一个二级指针，加一表示偏移一个数据类型（4个字节）。  运行结果： linux $ ./a.out  12 p: 0x9e66008 pp: 0xbfff22a8 pp + 1: 0xbfff22ac  代码：      1	#include <stdio.h>      2	#include <stdlib.h>      3	#include <string.h>      4	      5	int main(int argc, const char *argv[])      6	{      7		char *p = NULL;      8		char **pp = NULL;      9	     10		p = malloc(sizeof(*p)*4096);     11		bzero(p,4096);     12	     13		pp = &p;     14	     15		**pp = '1';     16		*(*pp+1) = '2';     17		printf("%s\n",p);	     18		printf("p: %p\n",p);	     19		printf("pp: %p\n",pp);	     20		printf("pp + 1: %p\n",pp + 1);	     21	     22	     23		free(p);     24		return 0;     25	}  谢谢！回答的很认真。

**(a+1) = '2'; ------> *(*a+1) = '2'; 另外记得释放申请的内存

第一个**a = ‘1’；不会报错 第二个**(a+1) = '2' 在这里出错


Question: mysql 获取字段部分乱码的问题~纠结

这得看 你这个 璟 字  在其他地方能不能显示了


Question: 大一新生 求大神指导我程序的错误

你while循环还少了一个do，main函数中switch那里有个while，它会一直陷在switch里面出不来的。你仔细一行一行的对一下你照抄的那本书，然后把错误从头一个一个找，改完第一个错误就编译，然后找新的第一个错误。里面有;){符号之类的一般是你少加了。undeclared 之类的一般是没有声明变量。看不懂英文错误就翻译一下，因为你大学四年碰到的错误就那么几个单词，顶多二十。我也是从那时候过来的。

通常   第一个缺少分号; 的二个缺少花括号 }

引用 3 楼 u013171165 的回复:[quote=引用 2 楼 guanjianai 的回复:] 楼主，你可能是看着程序敲的吧？初学编程，一定记得仔细看错误提示，错误提示里面提供了解决问题的基本思路，你这个一看就是语法错误，说的清清楚楚，缺少;符号。那么你找到对应位置解决。 鉴于你初学，再次提醒下，从第一个错误开始改，后续错误很可能是第一个错误引起的连锁反应，改了第一个，可能后续错误提示都会消失。 找个好的IDE（我用的我用的我当然推荐：http://blog.csdn.net/zhanh1218/article/details/32334517） 话说大一一般都不会开C语言课吧？为什么没人理呢？是这个太简单了？对于自学+初学的人来说，最重要的就是耐心指导嘛！而且相对于天天dota的人来说，也值得。[/quote]+1

不要使用main作为函数名称，也不要调用main，main只能作为程序的入口

引用 2 楼 guanjianai 的回复:楼主，你可能是看着程序敲的吧？初学编程，一定记得仔细看错误提示，错误提示里面提供了解决问题的基本思路，你这个一看就是语法错误，说的清清楚楚，缺少;符号。那么你找到对应位置解决。 鉴于你初学，再次提醒下，从第一个错误开始改，后续错误很可能是第一个错误引起的连锁反应，改了第一个，可能后续错误提示都会消失。 找个好的IDE（我用的我用的我当然推荐：http://blog.csdn.net/zhanh1218/article/details/32334517） 话说大一一般都不会开C语言课吧？为什么没人理呢？是这个太简单了？对于自学+初学的人来说，最重要的就是耐心指导嘛！而且相对于天天dota的人来说，也值得。

引用 3 楼 u013171165 的回复:[quote=引用 2 楼 guanjianai 的回复:] 楼主，你可能是看着程序敲的吧？初学编程，一定记得仔细看错误提示，错误提示里面提供了解决问题的基本思路，你这个一看就是语法错误，说的清清楚楚，缺少;符号。那么你找到对应位置解决。 鉴于你初学，再次提醒下，从第一个错误开始改，后续错误很可能是第一个错误引起的连锁反应，改了第一个，可能后续错误提示都会消失。 找个好的IDE（我用的我用的我当然推荐：http://blog.csdn.net/zhanh1218/article/details/32334517） 话说大一一般都不会开C语言课吧？为什么没人理呢？是这个太简单了？对于自学+初学的人来说，最重要的就是耐心指导嘛！而且相对于天天dota的人来说，也值得。[/quote]  楼主还是要学会耐心看看自己写的东西和错误的含义，因为以后一定要看的

我以前也碰到过这种情况，那时候使用的是VC++6.0，因为不支持C99，所以在VC++6.0里所有函数内的声明语句都得在执行语句之前，这样才能保证通过编译器的语法查错。  我也不保证楼主遇到的是这种问题，总之死马当活马医吧！ 引用 2 楼 guanjianai 的回复:

编译提示错误贴出来


Question: 敢死队问题请教

感觉题目出的好变态。。。

很简单的链表,问题出在哪里不明白?


Question: 函数反之指针类型探讨

char *r_chara()   {         int *p         static int a=8;         p=&a;         return (char *)p;     }

不能返回局部变量的地址

错误的，你返回了一个局部变量的地址。 其行为未定义，运气好程序运行正确。 运气不好，谁也不知道会怎么样

自己的 沙发


Question: 用随机产生器做关于链式基数排序会崩溃

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。


Question: 新人关于指针的疑问

上面少写了  int *p; int a,b; p = &b; *p = (int)&a; // p指向的地址是b，则把a的地址做为一个int存到了b中

1： Int *p; P=&a[0];  //p中存放的是a[0]这个元素的地址，也就是p指向了a[0] 和 Int *p; *P=&a[0]; //p指向的地址，那块内存里面存a[0]这个元素的地址，比如  int *p; int a,b; *p = (int)&a; // p指向的地址是b，则把a的地址做为一个int存到了b中   2：   Void swap(int*p1,int*p2) {     int*temp;     *temp=*p1;  //同上，*temp表示是 temp指向的地址里面存*p1，现在temp没有指向的地址，所以会出错； //temp=*p1是可以的，在这个函数里面，能够实现你想要的交换的功能。只是会比较怪异 //因为temp是指针，是int*，而*p1是int，类型不匹配。但是强制类型转换硬存，是能存进去的。      P1=*p2;     P2=*temp; }   Int *p; *p=3; //同上，p没有指向的内存，直接赋值是错误的。  引用 楼主 hans_dh 的回复:关于指针的疑惑 如何才算是给指针恰当的初始值，是在定义指针后马上就赋值吗？在同段代码里面，几行之后赋值算给恰当的初始值吗？（假设这中间并没有用到这个指针）。利用sanf函数从键盘键入一个算不算赋值了呢？有的书上说为了防止误写入，应当在定义指针后立刻赋值为NULL。那这个指针什么都不能干还有什么意义了呢？  在使用指针之前赋值，就是正确的。什么叫“使用指针“，比如你上面的*p，就是在使用p指针。 至于*p是在定义指针之后的什么地方，不要求。只要是在使用指针之前就可以。  利用sanf函数从键盘键入算赋值，但是你输入的可能是个非法值，是一个不能用的指针，并不是所有地址，都是可以让你随便用的。  在定义指针后立刻赋值为NULL，是对指针的初始化，但是不等于初始化之后，你就可以直接用了。你必须给指针一个合法的值，才可以开始使用

计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

1.都是危险，不要用。理由是对的。 2.赋值为null，就是写不了。但是可以保证不会成为野指针，不会讲别的数据冲掉。可以在需要使用的时候指向准确的空间即可。 如果你不知道什么时候用这个指针。这么做是规范和安全的。

{int*temp; *temp=*p1; P1=*p2; P2=*temp; } 改成 { int temp; temp=*p1; *p1=*p2; *p2=temp; }

Int *p; P=&a[0]; 和 Int *p; *P=&a[0]; ------> *p是int类型，&a[0]是int *类型，不可直接赋值，再说此时p是野指针，对*p写操作极其危险 都对吗？ 我认为都对，第一个意思是p和a[0]表示同一个数据。 －－－－》(*p)和a[0]才是表示同一个数据

感觉该说的都说了，lz写代码要把大小写区分好。。。

我就不喷了


Question: 关于epoll的一点疑问

不是多线程,是多进程

引用 2 楼 malone1 的回复:没抢到accept锁子,去处理其他的读写事件啊,不光只有连接事件的 那么这一部分是多线程都在处理吗？怎么没有保护 map<int,BaseEvent *>::iterator  iter;         for(size_t i =0;i<signalfd.size();i++)         {                 iter = m_clientmap.find(signalfd[i].fd);

没抢到accept锁子,去处理其他的读写事件啊,不光只有连接事件的

if(1 !=shmtx_trylock(m_pmtx)){//多进程抢锁,没抢到就只处理已经连接上来的客户端的事件                 baccept = false;                 m_Reator.Run(signalfd);                 // 你这里是不是应该退出了？，为什么还要去执行后面的东西         }         else{


Question: 请教C语言怎么捕获任何异常，并且把异常信息打印在文本文件里？谢谢

引用 6 楼 yangyunzhao 的回复:楼主说的可能是类似段错误、doublefree等问题吧。一般都是捕获信号，然后打印堆栈 我想实现的是类似与java的try excetion的功能，捕获任何异常

引用 7 楼 u011718046 的回复:[quote=引用 6 楼 yangyunzhao 的回复:] 楼主说的可能是类似段错误、doublefree等问题吧。一般都是捕获信号，然后打印堆栈 我想实现的是类似与java的try excetion的功能，捕获任何异常[/quote] C的标准的确没有异常机制，但即便是C++也无法像Java那样捕捉所有的异常，C/C++和Java还是有很大区别的。 楼主需要先了解下C/C++的基础知识。

引用 2 楼 Automation_dmu 的回复:自己限定所有抛出的异常都派生于exception， 定义what()方法输出异常信息。 catch(exception& e){        //输出e.what()到文件. } 楼主说的是C，你说的是C++

引用 7 楼 u011718046 的回复:[quote=引用 6 楼 yangyunzhao 的回复:] 楼主说的可能是类似段错误、doublefree等问题吧。一般都是捕获信号，然后打印堆栈 我想实现的是类似与java的try excetion的功能，捕获任何异常[/quote]  setjmp/longjmp就是错误处理，一旦发现一个不可恢复的错误，可以把控制转移  try catch就是建立在 setjmp/longjmp的基础上的      #include <stdio.h>       #include <setjmp.h>              jmp_buf buf;              void test_longjmp(void)       {         printf("test_longjmp() \n");         longjmp(buf, 1);         printf("end test_longjmp()\n");       }              void main(void)       {          if(setjmp(buf))            printf("back test_longjmp");          else            {              printf("first time to setjmp \n");              test_longjmp();            }       }

仅供参考longjmp Restores stack environment and execution locale.  void longjmp( jmp_buf env, int value );  Routine Required Header Compatibility  longjmp <setjmp.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  None  Parameters  env  Variable in which environment is stored  value  Value to be returned to setjmp call  Remarks  The longjmp function restores a stack environment and execution locale previously saved in env by setjmp. setjmp and longjmp provide a way to execute a nonlocal goto; they are typically used to pass execution control to error-handling or recovery code in a previously called routine without using the normal call and return conventions.  A call to setjmp causes the current stack environment to be saved in env. A subsequent call to longjmp restores the saved environment and returns control to the point immediately following the corresponding setjmp call. Execution resumes as if value had just been returned by the setjmp call. The values of all variables (except register variables) that are accessible to the routine receiving control contain the values they had when longjmp was called. The values of register variables are unpredictable. The value returned by setjmp must be nonzero. If value is passed as 0, the value 1 is substituted in the actual return.  Call longjmp before the function that called setjmp returns; otherwise the results are unpredictable.  Observe the following restrictions when using longjmp:   Do not assume that the values of the register variables will remain the same. The values of register variables in the routine calling setjmp may not be restored to the proper values after longjmp is executed.    Do not use longjmp to transfer control out of an interrupt-handling routine unless the interrupt is caused by a floating-point exception. In this case, a program may return from an interrupt handler via longjmp if it first reinitializes the floating-point math package by calling _fpreset.   Be careful when using setjmp and longjmp in C++ programs. Because these functions do not support C++ object semantics, it is safer to use the C++ exception-handling mechanism.  Example  /* FPRESET.C: This program uses signal to set up a  * routine for handling floating-point errors.  */  #include <stdio.h> #include <signal.h> #include <setjmp.h> #include <stdlib.h> #include <float.h> #include <math.h> #include <string.h>  jmp_buf mark;              /* Address for long jump to jump to */ int     fperr;             /* Global error number */  void __cdecl fphandler( int sig, int num );   /* Prototypes */ void fpcheck( void );  void main( void ) {    double n1, n2, r;    int jmpret;    /* Unmask all floating-point exceptions. */     _control87( 0, _MCW_EM );    /* Set up floating-point error handler. The compiler     * will generate a warning because it expects     * signal-handling functions to take only one argument.     */     if( signal( SIGFPE, fphandler ) == SIG_ERR )     {       fprintf( stderr, "Couldn't set SIGFPE\n" );       abort();   }     /* Save stack environment for return in case of error. First      * time through, jmpret is 0, so true conditional is executed.      * If an error occurs, jmpret will be set to -1 and false      * conditional will be executed.     */    jmpret = setjmp( mark );    if( jmpret == 0 )    {       printf( "Test for invalid operation - " );       printf( "enter two numbers: " );       scanf( "%lf %lf", &n1, &n2 );       r = n1 / n2;       /* This won't be reached if error occurs. */       printf( "\n\n%4.3g / %4.3g = %4.3g\n", n1, n2, r );        r = n1 * n2;       /* This won't be reached if error occurs. */       printf( "\n\n%4.3g * %4.3g = %4.3g\n", n1, n2, r );    }    else       fpcheck(); } /* fphandler handles SIGFPE (floating-point error) interrupt. Note  * that this prototype accepts two arguments and that the   * prototype for signal in the run-time library expects a signal   * handler to have only one argument.  *  * The second argument in this signal handler allows processing of  * _FPE_INVALID, _FPE_OVERFLOW, _FPE_UNDERFLOW, and   * _FPE_ZERODIVIDE, all of which are Microsoft-specific symbols   * that augment the information provided by SIGFPE. The compiler   * will generate a warning, which is harmless and expected.   */ void fphandler( int sig, int num ) {    /* Set global for outside check since we don't want     * to do I/O in the handler.     */    fperr = num;    /* Initialize floating-point package. */    _fpreset();    /* Restore calling environment and jump back to setjmp. Return      * -1 so that setjmp will return false for conditional test.     */    longjmp( mark, -1 ); } void fpcheck( void ) {    char fpstr[30];    switch( fperr )    {    case _FPE_INVALID:        strcpy( fpstr, "Invalid number" );        break;    case _FPE_OVERFLOW:        strcpy( fpstr, "Overflow" );         break;    case _FPE_UNDERFLOW:        strcpy( fpstr, "Underflow" );        break;    case _FPE_ZERODIVIDE:        strcpy( fpstr, "Divide by zero" );        break;    default:        strcpy( fpstr, "Other floating point error" );        break;    }    printf( "Error %d: %s\n", fperr, fpstr ); }   Output  Test for invalid operation - enter two numbers: 5 0 Error 131: Divide by zero   Process and Environment Control Routines  See Also   setjmp

C语言没有异常这一说，请自行进行合法性的判断。  然后，你可以  1.使用标准C库提供了abort()和exit()两个函数，强行终止程序的运行，<stdlib.h>。  2.使用assert(断言)宏调用，<assert.h>。  3.使用errno全局变量，<errno.h>。  4.使用goto跳转。  5.使用setjmp,longjmp跳转。

MSVC有SHE

引用 3 楼 zhao4zhong1 的回复:仅供参考longjmp  谢谢，没看懂，


Question: release和debug运行结果不一致，这是什么原因？求大神指教

谢谢大神们回复，5楼正解，受教了。

这种问题没有意义啊，除了在学校。 谁在工作中这样写代码，谁就会被鄙视。  代码执行正确是第一层，方便自己阅读是第二层，方便团队中所有成员阅读是第三层。  实际工作中，尽量写没有歧义的代码，尽量写任何人都能理解的代码，尽量少用奇巧淫技。

计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）

release是优化版本，编译器会做很多优化处理 debug是调试版本，为了易于调试，会按源代码忠实地编译为二进制 volatile的作用是告诉编译器不对该变量做优化处理，使用时老老实实从内存上取数据

引用 楼主 jinbei2009 的回复:最近我遇到一个问题，vs2012编写代码时，对自增运算符++操作时，发现release 和 debug结果不一致的情况（代码中的exp1），我对这种情况也做了其他尝试。现有两个问题 1、为什么我增加一行 scanf("%d",&c)，release 和debug 结果就一致了呢？ 2、volatile也可以让release和debug 两个结果一致，这是为什么？ 代码如下：  // 发现release版本和dubug版本不一致的情况  #include <stdio.h> #include <string.h> int fun(int a, int b) { 	return a+b; } void main() { 	//exp1,release show： a = 6, b = 10, debug show：a = 6,b = 11 	int a = 5; 	int b = fun(a++,a); 	printf("a = %d, b = %d\n",a,b);	 	//exp2,release & debug show：c = 6, d = 11 	int c = 5; 	int d = fun(c++,c); 	printf("c = %d, d = %d\n",c,d); 	scanf("%d",&c);//因为取地址，所以release没有优化？？ 	//exp3,release & debug show: e = 6, f = 11,  	volatile int e = 5;// volatile 一般在多线程中使用，在这里volatile起了什么作用？ 	int f = fun(e++,e); 	printf("e = %d, f = %d\n",e,f); 	//exp4,release & debug show: g = 5, h = 11,  	int g = 5; 	int h = fun(g,(g+1)); 	printf("g = %d, h = %d\n",g,h); 	//exp5,release & debug show: i = 6, j = 12 	int i = 5; 	int j = fun(i,++i);	 	printf("i = %d, j = %d\n",i,j); }   你Debug得到的值才是对的吧? 把Release的优化选项关掉就行了,我也碰到过

C++不保证你那种调用方式运算顺序。  CPU有一个叫做动态调度的东西，它会将两条不相关的指令的顺序改变执行。  自增++运算编译成汇编指令后有数条指令。编译器优化后，很有可能会是这样：  1将a放到寄存器 2将寄存器++ 3将寄存器放回a.  在寄存器放回a之前，cpu有可能会将a的数据压入函数栈，即在上面1-3的指令之间插入一个调用函数指令。  加了volatile会强制编译器不做优化，就是a++这个东西不放到寄存器，直接在内存上操作。  只能跟你说，不要写出根据函数参数的顺序来决定计算结果的代码！因为结果是不确定的！


Question: C语言 动态规划问题

我的思路很简单，这样的： 这个问题转化为求解一个最优的i，满足下面的条件 i左边的最大递增序列个数是mi， i右边的最大递减序列个数是ni， 最优解就是求解 max(mi + ni -1) 这样问题就转换为求解最大的递增子序列和递减子序列问题 而最大递增子序列问题很容易求解，网上讲解很多 我的算法基础比较差，大神们看了不要笑


引用 4 楼 Intel0011 的回复:const typeof( ((type *)0)->member ) *__mptr = (ptr); 这句话把三个参数都检查了，试想如果member是type结构体里的成员，但是member不是ptr所指的类型，换句话说ptr是正确的但是member是错误的，(type *)((char *)__mptr - offsetof(type, member)); 显然结果是错误的。但是 (type *)(ptr - offsetof(type, member));这句话编译器检查不出来，编译器不报错发出任何警告和错误  这个回答靠谱。有道理。  主要还是为了在编译阶段做检查及时发现错误。

避免该宏的返回值被修改。我猜。

引用 1 楼 mgy4938 的回复:大哥，你这么改，连人家最初的定义都改了！container_of宏，主要作用是用于获得某结构中某成员的入口地址。  #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) TYPE是某struct的类型 0是一个假想TYPE类型struct,MEMBER是该struct中的一个成员. 由于该struct的基地址为0, MEMBER的地址就是该成员相对与struct头地址的偏移量。 关于typeof,这是gcc的C语言扩展保留字,用于声明变量类型. const typeof( ((type *)0->member ) *__mptr = (ptr);意思是声明一个与member同一个类型的指针常量 *__mptr,并初始化为ptr. (type *)( (char *)__mptr - offsetof(type,member) );意思是__mptr的地址减去member在该struct中的偏移量得到的地址, 再转换成type型指针. 该指针就是member的入口地址了.  你没理解我问的什么意思。  这个宏的用途是获取包含member成员的结构体的基址。哪里是获取某成员的入口地址。


Question: C语言 急  谢谢啊：怎样在一个文本里提取以数字开头的行内容

我是来混分的  感觉这个用c有点大炮打蚊子，不如用脚本来的快；当然，给客户做应用程序就另说了

引用 2 楼 liuhengxiao 的回复:1、顺序读取每一行，fgets（）函数 2、使用函数isdigit（）判断读取到的每一行的第一个字符是不是数字 3、第一个字符是数字的字符串追加到另一个文本中，fprintf()函数   就用这个

if(buffer[0] >= '0' && buffer[0] <= '9'){ //数字 //写入文件 }

引用 1 楼 caozhy 的回复:C#只要1行： File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).ToArray()); 数字排序按在文本出现的早晚，做了这一点吗。

非常感谢楼上的几位大神老师、大哥大姐，特别感动！！ 我昨晚自己赶工基本上做出来了，现在在弄另一个问题，焦急！

看错了。 File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).GroupBy(x => x).SelectMany(x => x).ToArray());

引用 3 楼 Intel0011 的回复:[quote=引用 1 楼 caozhy 的回复:] C#只要1行： File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).ToArray()); 数字排序按在文本出现的早晚，做了这一点吗。 [/quote]  File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).OrderBy(x => x).ToArray());

这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。  //在一个文本里提取以数字开头的行内容，并排序后导出到另一文本，急  谢谢啊 //（数字排序按在文本出现的早晚，如下就是 220  10  110 ） //例如：1.txt //白云城1#测距 //五峰GPS定位 //220km故障 //10km白07备用 //110km检修 //夜明珠2#断档 //220km故障 //110km检修 // //导出到2.txt //220km故障 //220km故障 //10km白07备用 //110km检修 //110km检修 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXL 1000  //最多数字开头的行数 #define MAXC 100   //每行最多字符 #define MAXD 10000 //数字最大值 char ln[MAXC]; static char s[MAXL*MAXC]; static int o[MAXD]; int n,d,i; FILE *f; int compare(const void *arg1,const void *arg2) {     int d1,d2;     sscanf((char *)arg1,"%d",&d1);     sscanf((char *)arg2,"%d",&d2);     return o[d1]-o[d2]; } int main() {     f=fopen("1.txt","r");     if (NULL==f) {         printf("Can not open file 1.txt!\n");         return 1;     }     n=0;     while (1) {         if (NULL==fgets(ln,MAXC,f)) break;         if (1==sscanf(ln,"%d",&d)) {             strcpy(s+n*MAXC,ln);             if (0==o[d]) {                 o[d]=n+1;             }             n++;             if (n>=MAXL) {                 printf("Too many lines(>%d)!\n",MAXL);                 break;             }         }     }     fclose(f);     qsort(s,n,MAXC,compare);     f=fopen("2.txt","w");     for (i=0;i<n;i++) {         fprintf(f,"%s",s+i*MAXC);     }     fclose(f);     return 0; }


Question: 大圆的半径为100m，里面均匀分布着10个小圆

啥叫“均匀”？

反正我觉得向日葵够均匀了。

引用 21 楼 zjq9931 的回复:[quote=引用 20 楼 zhao4zhong1 的回复:] 啥叫“均匀”？ 中心不为有两个点距离太近。 [/quote]  引用 21 楼 zjq9931 的回复:[quote=引用 20 楼 zhao4zhong1 的回复:] 啥叫“均匀”？ 中心不为有两个点距离太近。 [/quote] 又错字了，中心部位，有两个点距离太近。。

引用 20 楼 zhao4zhong1 的回复:啥叫“均匀”？ 中心不为有两个点距离太近。

引用 7 楼 gcx_499288957 的回复:那样不行吧，要是都在一个圆周上面肯定不行的啊，你看在这样的可以的到吗？就是类似这种的。谢谢啦。 这个不均匀。

均分圆的代码  void CMyDlg::OnButton2()  {  // TODO: Add your control notification handler code here  CDC *pDC;  pDC = this->GetDC();  int iList[100];  iList[0]=1;	 //费氏数列初始的两个元素  iList[1]=1;  int i;  int ix;	 //横坐标的整数点  int iy;	 //纵坐标的整数点  double dR=200;	 //半径  int iStart=300;   int iNum=9;	 //画几边形；10个圆就是，10-1边形    double dx,dy;  double dPi = 3.1415926535;	//π，2π是一个圆周  double dPercision = 0.01;	//精度0.01弧度	数值小，越像多边形  double da=0;	 //角度  dx = cos(da)*dR;	 //取得XY坐标，cos和sin呼唤，可以改变旋转方向，目前是顺时针  dy = sin(da)*dR;  ix = int(dx);	 //取整  iy = int(dy);  pDC->MoveTo(iStart+ix, iStart+iy);   for(da=0; da<=2*dPi; da+=dPercision)	//画圆  {   dx = cos(da)*dR;   dy = sin(da)*dR;   ix = int(dx);   iy = int(dy);   pDC->LineTo(iStart+ix, iStart+iy);  }   i=0;  dPercision = 2*dPi/9.00001;	//画内接九边形  for(da=0; da<=2*dPi; da+=dPercision)  {   dx = cos(da)*dR;   dy = sin(da)*dR;   ix = int(dx);   iy = int(dy);   iList[i++]=ix;   iList[i++]=iy;   pDC->LineTo(iStart+ix, iStart+iy);   pDC->LineTo(iStart, iStart);   pDC->LineTo(iStart+ix, iStart+iy);  }   i=0;  dPercision = 2*dPi/9.00001;	//画外接九边形  dR=dR/sin(dPi-dPercision/2-dPi/2);//(半径变化)  for(da=0; da<=2*dPi; da+=dPercision)  {   dx = cos(da)*dR;   dy = sin(da)*dR;   ix = int(dx);   iy = int(dy);   iList[i++]=ix;   iList[i++]=iy;   pDC->LineTo(iStart+ix, iStart+iy);   pDC->LineTo(iStart, iStart);   pDC->LineTo(iStart+ix, iStart+iy);  }    pDC->SetTextColor(RGB(255, 0, 0));  i=0;  dPercision = 2*dPi/9.00001;	//画外接九边形  //dR=dR/sin(dPi-dPercision/2-dPi/2);	  for(da=dPercision/2; da<=2*dPi+dPercision/2; da+=dPercision)//转动半顶角个角  {   dx = cos(da)*dR;   dy = sin(da)*dR;   ix = int(dx);   iy = int(dy);   iList[i++]=ix;   iList[i++]=iy;   pDC->LineTo(iStart+ix, iStart+iy);   pDC->LineTo(iStart, iStart);   pDC->LineTo(iStart+ix, iStart+iy);  }

求最大内接正方形边长   2R/根号2  边长/直径

N是一个不确定的数就您刚才说的6个点，您画的图那个算是均匀的。然后10个点，20个点，100个点等等情况，都是均匀分布的，所以想用小的算法进行实现一下。另外您说的第二个问题，现在就认为小圆是一个点吧，不去考虑半径问题。这样旧不存在相交的问题了。谢谢楼上

半径为100m的圆中最多能存放多少个边长为4m的正方形，就能存放多少个半径为2m的圆吧？  把半径100m的圆放在边长为200m的正方形中，将大的正方形切割成边长为4m的小正方形  如果小正方形能够落在半径100m的大圆中，这个正方形的位置就半径2m小圆的位置  在大正方形中从左上角的第一个小正方形进行判断，向右，然后再向下，直到坐标不在大正方形中  所有符合条件的正方形中心的坐标也就是小圆的圆心坐标  不直到我这么个思路对不对，大半夜的想睡觉了~

lz这个问题有三点不明  1、如何定义的均匀，比如n = 6时，那种算均匀   2、N是多少，不同的值可能又有不同的方案  3、小圆能不能重叠，能不能相交

引用 14 楼 zhao4zhong1 的回复:建议楼主买个成熟的向日葵，观察其瓜子的分布。 是对数螺线，不是阿基米德螺线。   仿生学

建议楼主买个成熟的向日葵，观察其瓜子的分布。 是对数螺线，不是阿基米德螺线。

算法我也看不懂 ， 仅仅是翻译一下他的代码    #include <math.h>  int n = 256;  float pi = 3.1415926f; float golden_angle = pi * (3 - sqrt(5));  for(int i = 1; i <= n; i++) {   float theta = i * golden_angle;   float r = sqrt(i) / sqrt(n)   printf("第i个圆心为：%f，%f\n", r * cos(theta), r * sin(theta)); }

引用 10 楼 zilaishuichina 的回复:[quote=引用 7 楼 gcx_499288957 的回复:] 那样不行吧，要是都在一个圆周上面肯定不行的啊，你看在这样的可以的到吗？就是类似这种的。谢谢啦。  那么你这些点的排列，又有什么规律呢？  假设你这N个点是排列均匀的，我加一个点上去你打算排到哪个位置呢，还是家一个点就得换一个规则再来排列了呢？  所以我刚才问你：如何定义的均匀，怎么样的才算是均匀？ 以及 N是多少， N的值不同， 是不是可能就有不同的排列方案了？[/quote] 他这个是按照一定的算法进行分布的，256个点能均分，那么257个点也会均分的吧。http://blog.marmakoide.org/?p=1这个我不是太懂看的

假设你的N个点 已经排列均匀，  我再加一个点上去， 这个新点，你打算放在什么位置，你打算怎样去维持这N+1个点依然是均匀的？

引用 7 楼 gcx_499288957 的回复:那样不行吧，要是都在一个圆周上面肯定不行的啊，你看在这样的可以的到吗？就是类似这种的。谢谢啦。  那么你这些点的排列，又有什么规律呢？  假设你这N个点是排列均匀的，我加一个点上去你打算排到哪个位置呢，还是家一个点就得换一个规则再来排列了呢？  所以我刚才问你：如何定义的均匀，怎么样的才算是均匀？ 以及 N是多少， N的值不同， 是不是可能就有不同的排列方案了？

大约 让 N个半径为R的圆，充满半径为100m的圆，求出处R即可。 R >= 2m

阿基米德螺线。


Question: 有关数组和指针的问题

引用 楼主 chenye277 的回复:# include <stdio.h>  int main(){ 	char name[4]; 	printf("Enter your name:"); 	scanf("%s",name); 	printf("YOur name is %s\n",name); //	printf("name's %p",sizeof(name));//这个输出还是4 	for(i=0;name[i]!='\0';i++){ 		printf("%c",name[i]); 	return 0; }  在这个程序中，我一开始已经声明了name的数组大小，为什么这个程序跑起来，输入4个以上的字符它输出还是4个以上的字符。为什么这个4这个大小没有其作用， 两种方式输出都是一样的，如输入asdfghjkl输出也是asdfghjkl, 所以长度没有所用，按照name指针一直输出到\0为止了是么。 但如果用scanf("%4s",name) 或fgets函数就可以了。  注意这个字符数组最好长一点，输入的时候最好比字符数组少一个字符 因为最后一个字符存放\0  char name[50]={0}; 使用数组习惯性的在后面加{0} 初始化数组，使用起来更安全

不对数组检查越界，让你自己来。

越界存储了

scanf有风险，调用需谨慎。。。

# include <stdio.h>  int main(){ char name[4]; printf("Enter your name:"); scanf("%3s",name); printf("YOur name is %s\n",name); //  printf("name's %p",sizeof(name));//这个输出还是4 for(i=0;name[i]!='\0';i++){ printf("%c",name[i]); return 0; }

scanf函数是不安全的 你虽然只定义了4的空间，但scanf不会管这个，你输入多少它读多少 4字符以内保证安全，超出4字符就不确定会发生什么了，可能覆盖掉其它数据，只是很多时候恰好没有出问题而已

你这肯定不会只输出4个字符啊，因为你的循环体是到‘\0’才结束的，虽然你的数组只有4个字符，可是当你输入的字符个数超过4个他还是会放在name内存的第五个以后挨个存放的，输出时就到‘\0’结束，你在输入时加个4就限制了他只能接受四个字符，所以你以后输进去的字符就不会出现在name4个内存之后了，sizeof（name）算的是name空间的大小，你只申请了4个所以是4


Question: C语言程序设计———学生学籍管理系统

我记得当年我们自己做系统的时候都是百度  而不是发帖

百度一下，一搜一大把，而且功能都比这个高级得多

有人50就做了，呵呵呵

500不行， 我要600

引用 1 楼 teddy99999 的回复:500块帮你做 支持，等价交换。 你付出时间，他获得学分

这个百度一下好，没人有义务帮你做这个

这个百度一下好，没人有义务帮你做这个

这个不难，自己看书学一学，遇到问题了再过来问吧！

500块帮你做


Question: 面试时一个问题，菜鸟到现在也想不明白，求教牛人、、、

移位运算可以使用吗？c=a+b+(b>>1);  引用 15 楼 lin5161678 的回复:[quote=引用 10 楼 zxh707wk 的回复:] 这样吗？ c=a+b+(a==b)别乱写 误人子弟[/quote] 他的结果也是正确的啊。就是好像没跟编译原理挂上挂上钩吧。那使用移位运算也是不行的吧？c=a+b+(b>>1); 高手详解~

c=c+(a==b ? 1:0)

2+2=5?在算错的情况下等于5。

为什么面试经常出这种非人类的，没有任何意义的问题

引用 5 楼 zyjj_99 的回复:char s[]="5"; char a[]="2"; int b=2; count<<a<<"+"<<b<<"="<<a+b<<endl;  变量a是个指针，当a+b,实际上就是指针地址+2，正好指向了s所指的内存。。。。。 不是很理解zyjj_99 我也特地的去验证了下

引用 15 楼 lin5161678 的回复:[quote=引用 10 楼 zxh707wk 的回复:] 这样吗？ c=a+b+(a==b)别乱写 误人子弟[/quote]题目理解错了。。。

引用 4 楼 brookmill 的回复:前几天有个“2+2=5”的帖子，倒也和编译原理有点关系。 http://bbs.csdn.net/topics/390820427 不过我觉得这个有点......闲的无聊拿来消遣还可以，作为面试题有点胡闹  胡闹的面试题似乎还有 +++, ---之类的

完全是用来显摆的面试题,么价值

引用 9 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390627329   嗯嗯嗯，多谢赵老师，开阔眼界了，受教！！！

2 + 2 = 烫烫烫烫烫5  好恶心。。。。

引用 10 楼 zxh707wk 的回复:这样吗？ c=a+b+(a==b)别乱写 误人子弟

引用 4 楼 brookmill 的回复:前几天有个“2+2=5”的帖子，倒也和编译原理有点关系。 http://bbs.csdn.net/topics/390820427 不过我觉得这个有点......闲的无聊拿来消遣还可以，作为面试题有点胡闹  当时就懵了，想着这2+2得4都写到内存了，怎么让它还能变，就一直百思不得其解，还以为特别高深，也就忘了问他怎么实现了，如果真是这个答案，那我只能说句他真蛋疼，这跟脑筋急转弯有什么区别、、、、、有意思么？？？

引用 1 楼 gy429476195 的回复:只是a+b？不能使用自增吗？ 引用 1 楼 gy429476195 的回复:只是a+b？不能使用自增吗？  不能啊，当时我就懵了、、、他说与语法有关、、、

栈是倒着生长的。

引用 5 楼 zyjj_99 的回复:char s[]="5"; char a[]="2"; int b=2; count<<a<<"+"<<b<<"="<<a+b<<endl;  变量a是个指针，当a+b,实际上就是指针地址+2，正好指向了s所指的内存。。。。。  我刚学电脑有点不明白，为什么调试的时候显示s占高地址而a占低地址，不是应该先生成s s占地址而a占高地址吗？

这样吗？ c=a+b+(a==b)


Question: 二维数组

警告说的是cp的第二个参数期望的是conts double (*)[]类型，但是实际传入的参数是double (*)[5]类型的，这个可以不用理会。 第一个函数没有输出，还有就是k为int型，k*1/3的结果肯定是int型。最后赋值只是把int型转换为了double。 其他的暂时没有看出问题。

C99的东西，一些编译器处理起来并一定符合标准 还是用C89吧，在main()构建一个指针数组来向函数传递数组行的首址

哦，再多句嘴，函数参数是二维数组的时候，必须要知道列的元素个数 也就是说 void cp(int h,int g,const double sar[*],double lar[*][*]); void pri(int a,int b,const double [*][*]);  改成 void cp(int h,int g,const double sar[*][5],double lar[*][5]); void pri(int a,int b,const double [*][5]);  你的这种用法我没用过，也不知道是啥意思，我在Windows上编译是过不去的 建议你还是用最容易看懂的方式写代码

还有个就是。。你打印出来很难看 void pri(int a,int b,const double ar[a][b]) {         int k,i;         for(k=0;k<a;k++)         {                 for(i=0;i<b;i++)                         printf("%d*%d=%.2f",k,i,ar[k][i]);//这里打印的时候加个分隔符                 putchar('\n');         } }

void cp(int h,int g,const double sar[h][g],double lar[h][g]) {         int j,k;         for(j=0;j<h;j++)         {                 for(k=0;k<g;j++) //这里应该是k++，你把j++数组都越界了，肯定报段错误                         lar[j][k]=sar[j][k];         } }

我那个警告是什么意思？

仅供参考#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //


Question: readdir为什么是非线程安全的

引用 1 楼 zhao4zhong1 的回复:加锁。感谢赵老师的回复，不过在我看来，即使不加锁，也不影响其使用效果。如果两个线程操作同一个directroy stream，确实会影响扫描的目录集合；其他情况的话，就没有必要加锁了。不知我这样理解对吗？

引用 3 楼 user-2 的回复:官网文档的解释用了可能（may）一词，说明 readdir 的具体实现不必是线程安全的。当然，具体的库开发者可以将其实现为线程安全的，也可以实现为非线程安全的。作为程序调用者，尤其是遇到跨平台的情况，应该不能依赖于具体的实现机制，而只能因为readdir 不是线程安全的。收益，感谢

参考readdir的源代码。

加锁。


Question: 有没有可以C实现的Huffman压缩与解压源代码啊


Question: 一个复杂结构体怎么分配空间

请检查: p_procinparams->p_pgm_pcm_buffers = (dlb_buffer *)malloc(sizeof( dlb )); 是否要改为: p_procinparams->p_pgm_pcm_buffers = (dlb_buffer *)malloc(sizeof( dlb_buffer ));

引用 6 楼 zhao4zhong1 的回复:进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令估计不大好调，因为我是写一个接口，调用了很多外部ffmpeg的源代码的函数

引用 10 楼 lovesmiles 的回复:是不是double free还不知道呢，你能不能单步调试？要不就缩减代码，一步步确定加了那一段代码会出错。  这样的错误多数是访问了错误的内存引起的吧。如果bug能百分百重现，耐心一点总能找到原因的。谢谢，能单步调试，我是一溜错改过来的，就是这个时间有点紧

引用 8 楼 xiaohuh421 的回复:你没有调用free, 而又出现free崩溃.  那肯定是ddpi_enc_process内部分配了东西, 但, 由于你外部指定的某些长度不正确, 导致了内部访问越界, 释放的时候就崩溃..  你需仔细阅读ddpi_enc_process函数和 那个结体的说明.有道理假如我malloc时设置了很大的空间会不会这样呢，想排除一下

引用 6 楼 zhao4zhong1 的回复:进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令 core文件生成目录好像被我无意间改过一次，请问怎么让它生成在当前目录下啊，现在找不到

引用 5 楼 xiaohuh421 的回复:p_procinparams->p_pgm_pcm_buffers[0].ppdata = malloc(10 * sizeof(input_buffer));  ppdata 这个东西是一个二级指针 , 可能它是由ddpi_enc_process函数内部分配的, 可能由于某些原因, 比如你操作越界, 导致堆被破坏, 这时free就会崩溃.  你把所有对ppdata操作的地方全部注释掉, 然后再看会不会崩溃就知道了.还是会崩溃，double free，这个二级指针是一个buffer数组，指定输入输出buffer用的

引用 1 楼 lovesmiles 的回复:这样分配空间没有错， 能不能附一下你出错的api?那个东西double free了？你确实是在这个东西出错了吗？那个api的代码看不到的，不过是对的，因为我在写一个接口，肯定是我写的问题

引用 1 楼 lovesmiles 的回复:这样分配空间没有错， 能不能附一下你出错的api?那个东西double free了？你确实是在这个东西出错了吗？ here comes encoder frame ddpi_enc_process failed Audio encoding failed (avcodec_encode_audio2) *** glibc detected *** /home/knight/Desktop/ffmpeg-2.2.2/ffmpeg_g: double free or corruption (out): 0x000000000176b400 *** 中间是一段memory map  Program received signal SIGABRT, Aborted. 0x00007ffff69ba445 in raise () from /lib/x86_64-linux-gnu/libc.so.6

引用 1 楼 lovesmiles 的回复:这样分配空间没有错， 能不能附一下你出错的api?那个东西double free了？你确实是在这个东西出错了吗？ static int dolbydd_encode_frame(AVCodecContext *avctx,AVPacket *pkt,const AVFrame *frame,int *got_packet) {         printf("here comes encoder frame\n");         int err;         ddpi_enc_pgm_status enc_status;         dolbyddAudioContext *s = avctx->priv_data;         dlb_buffer *dlb;         enc_exec *exec;         ddpi_enc_process_ip   *p_procinparams ;         ddpi_enc_process_op   *p_process_op ;         /**********************************************************************************/          p_procinparams = (ddpi_enc_process_ip   *)malloc(sizeof(p_procinparams));         p_process_op = (ddpi_enc_process_op   *)malloc(sizeof(p_process_op));         p_procinparams->p_pgm_pcm_buffers = (dlb_buffer *)malloc(sizeof( dlb ));          if(&(p_procinparams->nsamples) == NULL)         {                 printf("p_procinparams->nsamples == NULL\n");                 return -1;         }          if(p_procinparams->p_pgm_pcm_buffers == NULL)         {                 printf("p_procinparams->p_pgm_pcm_buffers malloc failed\n");                 return -1;         }          int32_t *input_buffer = (int32_t *)frame->data[0];         p_procinparams->p_pgm_pcm_buffers[0].ppdata = malloc(10 * sizeof(input_buffer));          /* initialize buffer descriptor: default to max number of channels */         p_procinparams->p_pgm_pcm_buffers[0].nchannel  = avctx->channels;         /* initialize stride to 0; set to match input files with max chans in loop below */         p_procinparams->p_pgm_pcm_buffers[0].nstride   = 1;         p_procinparams->p_pgm_pcm_buffers[0].ppdata[0] = input_buffer;         p_procinparams->p_pgm_pcm_buffers[0].data_type = DLB_BUFFER_INT_LEFT;         p_procinparams->nsamples = DDPI_ENC_BLKSIZE_MAX ;         p_procinparams->npgms = 1;         pkt->size = sizeof(p_procinparams->nsamples);                 p_process_op->p_status = &enc_status;         int32_t *output_buffer = (int32_t *)malloc(100 * sizeof(p_procinparams->nsamples));  p_process_op->bitstream.ppdata = output_buffer;         p_process_op->bitstream.data_type = DLB_BUFFER_OCTET_UNPACKED;         p_process_op->bitstream.nchannel  = avctx->channels;         p_process_op->bitstream.nstride   = 1;         p_process_op->p_status->p_peak = 181;         p_process_op->noctets = 0;            /* call subroutine API to encode the frameset */         err = ddpi_enc_process                 (s->p_enc                  ,p_procinparams                  ,p_process_op                 );         if(err)         {                 printf("ddpi_enc_process failed\n");                 return -1;         }          pkt->size = p_process_op->noctets;         pkt->data = p_process_op->bitstream.ppdata[0];          pkt->pts  = frame->pts;     return 0; }             这是我整个函数的代码，可能有点长，不过好多是赋值，我不确定是在这出错了，因为还有个初始化函数，我再贴一下调试信息


Question: C语法

我觉得二楼说的在理

计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

input !=NULL表示分配了内存空间； input [0] !='\0'数组的内容不为空

1.input != NULL 是确保已给input分配了空间 2.input[0] !='\0' 是判定input的内容不为空

nput ！=NULL 是指数组的指针不为空，input[0]!=‘\0’是指数组的第一个元素不为空.


Question: 新手求教

引用 7 楼 u010236550 的回复:http://blog.csdn.net/u010236550/article/details/19005909感谢，，虽然没有找到我想要的书

引用 1 楼 zhao4zhong1 的回复:《数据结构（C语言描述）》 《算法精解（C语言描述）》 请问是谁写的书？

感谢楼上的帮忙

别的数据结构太枯燥了，可以看看《大话数据结构》再看其它的书进阶。

《数据结构与算法分析（C语言描述）》

《数据结构与算法分析（C语言描述）》

《数据结构（C语言描述）》 《算法精解（C语言描述）》


Question: 用C语言获取jpg中的YUV信息

libjpeg 是一个完全用C语言编写的库，包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。


Question: 如何用C处理大型多维数组？

你搞这么大，栈区是不是会受不了，可能有的时候会出现overflow

写成文件，内存映射！

尺寸从小到大： 堆栈＜全局数据＜堆＜内存映射文件＜文件＜硬盘＜硬盘阵列＜云存储＜整个互联网

引用 10 楼 u013601471 的回复:那除了这个方法之外，有没有其他比较常用的方法了啊？  除了动态分配内存，我想不出来还能玩出什么花样了  不管怎么写，肯定都是要建立在动态分配内存的基础上的

引用 9 楼 zilaishuichina 的回复:[quote=引用 8 楼 u013601471 的回复:] [quote=引用 5 楼 zilaishuichina 的回复:] float *beta_gama = new float[YEARS * ROWS * COLS]; float *beta_average = new float[ROWS * COLS]; float *gama_average = new float[ROWS * COLS];  如果还不行 float **beta_gama = new float *[YEARS]; for (int i = 0; i < YEARS; i++) {     beta_gama[i] = new float[ROWS * COLS]; }  如果还不行 以此类推  hi，用指针进行数组计算简直就是噩梦啊。。。三维指针的交叉运算更是梦魇啊。。。[/quote]   typedef float* floatp; typedef float** floatpp; typedef float*** floatppp;  int _tmain(int argc, _TCHAR* argv[]) { 	float a = 1.0f; 	floatppp beta_gama = new floatpp[3]; 	for (int i = 0; i < 3; i++) 	{ 		beta_gama[i] = new floatp[3]; 		for (int j = 0; j < 3; j++) 		{ 			beta_gama[i][j] = new float[3]; 			for (int k = 0; k < 3; k++) 			{ 				beta_gama[i][j][k] = a; 				a = a + 1; 			} 		} 	}  	for (int i = 0; i < 3; i++) 	{ 		for (int j = 0; j < 3; j++) 		{ 			for (int k = 0; k < 3; k++) 			{ 				printf("%f\n", beta_gama[i][j][k]); 			} 		} 	}  	for (int i = 0; i < 3; i++) 	{ 		for (int j = 0; j < 3; j++) 		{ 			delete[] beta_gama[i][j]; 		} 		delete[] beta_gama[i]; 	} 	delete[] beta_gama; } 和你使用普通数组 没区别了吧[/quote]  给大神跪了！ 那除了这个方法之外，有没有其他比较常用的方法了啊？

引用 8 楼 u013601471 的回复:[quote=引用 5 楼 zilaishuichina 的回复:] float *beta_gama = new float[YEARS * ROWS * COLS]; float *beta_average = new float[ROWS * COLS]; float *gama_average = new float[ROWS * COLS];  如果还不行 float **beta_gama = new float *[YEARS]; for (int i = 0; i < YEARS; i++) {     beta_gama[i] = new float[ROWS * COLS]; }  如果还不行 以此类推  hi，用指针进行数组计算简直就是噩梦啊。。。三维指针的交叉运算更是梦魇啊。。。[/quote]   typedef float* floatp; typedef float** floatpp; typedef float*** floatppp;  int _tmain(int argc, _TCHAR* argv[]) { 	float a = 1.0f; 	floatppp beta_gama = new floatpp[3]; 	for (int i = 0; i < 3; i++) 	{ 		beta_gama[i] = new floatp[3]; 		for (int j = 0; j < 3; j++) 		{ 			beta_gama[i][j] = new float[3]; 			for (int k = 0; k < 3; k++) 			{ 				beta_gama[i][j][k] = a; 				a = a + 1; 			} 		} 	}  	for (int i = 0; i < 3; i++) 	{ 		for (int j = 0; j < 3; j++) 		{ 			for (int k = 0; k < 3; k++) 			{ 				printf("%f\n", beta_gama[i][j][k]); 			} 		} 	}  	for (int i = 0; i < 3; i++) 	{ 		for (int j = 0; j < 3; j++) 		{ 			delete[] beta_gama[i][j]; 		} 		delete[] beta_gama[i]; 	} 	delete[] beta_gama; } 和你使用普通数组 没区别了吧

引用 5 楼 zilaishuichina 的回复:float *beta_gama = new float[YEARS * ROWS * COLS]; float *beta_average = new float[ROWS * COLS]; float *gama_average = new float[ROWS * COLS];  如果还不行 float **beta_gama = new float *[YEARS]; for (int i = 0; i < YEARS; i++) {     beta_gama[i] = new float[ROWS * COLS]; }  如果还不行 以此类推  hi，用指针进行数组计算简直就是噩梦啊。。。三维指针的交叉运算更是梦魇啊。。。

malloc 啊。动态分配。

栈空间有限，虽然能改大，但还是远远小于堆

引用 1 楼 user-9 的回复:不要这么玩，这么大的东西一定要在程序初始化的时候动态申请内存 你初始化一下这些数据的话，你这个有多大，你的可执行文件就有多大 这些数据都是从文件中读进来的，可执行文件不大。动态申请内存没有限制吗？怎么写啊？

mmap?内存映射~~

动态申请吧...


Question: 关于CreateProcess（）函数的一点疑惑，请指教

CreateProcess("c:\\Program File\\Internet Explorer\\IEXPLORE.EXE",NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi); 路径Program File中少了一个s，应该是Program Files  CreateProcess("c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);

你都不看看CreateProcess是不是创建进程是否成功了？


Question: 用c语言编写一个年历系统

引用 7 楼 qq_17153977 的回复:引用 4 楼 u010957746 的回复:引用 1 楼 user-7 的回复:看看Linux cal 源码+++++++++++++111111111111111啥意思？Linux 中的 cal功能很强大的

引用 9 楼 qq_17153977 的回复:[quote=引用 8 楼 yangyangsnr 的回复:] [quote=引用 6 楼 qq_17153977 的回复:] [quote=引用 2 楼 yangyangsnr 的回复:] http://blog.csdn.net/yangyangsnr/article/details/29220581 N久之前写的，写的太复杂的，能用就凑合着用吧。 而且，写这么复杂都用不了250行，你们老师有必要搞个长度要求么？就是不知道老师怎么想的，哭了都，大神你能不能帮帮忙，[/quote] http://blog.csdn.net/yangyangsnr/article/details/29220581 打开链接，复制，粘贴，编译，完事。[/quote]好吧，谢谢大神，我试了一下，真的可以也。只是我要把它在加加改改成250行代码。[/quote]各种空格 换行  空白行

一个简单算法： 取得那一年第一天零时的time_t值t0 （调用time.h中的mktime） 然后每次在t0上累加24小时 （24*60*60秒），然后调用localtime就可以获得星期/月份/日期数据 依次累加至年份变化为止  当然效率高些的算法也有，只调用一次mktime，获得那一天第一天星期几 然后接下来的365天或者364天的星期数据就是基于累加值对7取模的线性计算 至于日期数据，根据年份你能知道每个月有几天，所以每天几月几号都可以算下来 这种算法，用两重的for循环就可以实现了  代码不写了，建议根据第二种算法来，呵呵

引用 8 楼 yangyangsnr 的回复:[quote=引用 6 楼 qq_17153977 的回复:] [quote=引用 2 楼 yangyangsnr 的回复:] http://blog.csdn.net/yangyangsnr/article/details/29220581 N久之前写的，写的太复杂的，能用就凑合着用吧。 而且，写这么复杂都用不了250行，你们老师有必要搞个长度要求么？就是不知道老师怎么想的，哭了都，大神你能不能帮帮忙，[/quote] http://blog.csdn.net/yangyangsnr/article/details/29220581 打开链接，复制，粘贴，编译，完事。[/quote]好吧，谢谢大神，我试了一下，真的可以也。只是我要把它在加加改改成250行代码。

引用 6 楼 qq_17153977 的回复:[quote=引用 2 楼 yangyangsnr 的回复:] http://blog.csdn.net/yangyangsnr/article/details/29220581 N久之前写的，写的太复杂的，能用就凑合着用吧。 而且，写这么复杂都用不了250行，你们老师有必要搞个长度要求么？就是不知道老师怎么想的，哭了都，大神你能不能帮帮忙，[/quote] http://blog.csdn.net/yangyangsnr/article/details/29220581 打开链接，复制，粘贴，编译，完事。

引用 2 楼 yangyangsnr 的回复:http://blog.csdn.net/yangyangsnr/article/details/29220581 N久之前写的，写的太复杂的，能用就凑合着用吧。 而且，写这么复杂都用不了250行，你们老师有必要搞个长度要求么？就是不知道老师怎么想的，哭了都，大神你能不能帮帮忙，

看看Linux cal 源码


Question: C语言——关于数据溢出

晕了，发出来就发现 我的变量类型声明错了

可以选择 无满意结帖 关闭该帖


Question: TC伪随机数加密

实在没分了只能靠回复了,求大神帮助啊. 需求就是从一个站点A开始,获取A站点上所有的链接,把获取到的链接存到domain_data数据表里,同时把A站点 存到domain_exist表里用来判断是否获取过. 从A站点获取到链接后存到一个数组中,然后从这个数组中取一个链接,判断这个链接是否在domain_exist出现过, 如果没有就插入到domain_exist表中.然后获取这个新插入的链接页面中的所有链接,如果当前链接无法访问,就取数组中下一个下标,造成一个循环,两个表中都不允许有重复数据. 获取链接的格式限制是:data表中不能有exist表中的链接以免造成重复获取, 存储格式统一为www.baidu.com,或者baidu.com,XXX.baidu.com. 不能有http://XXX.XXX/ 无限制循环,程序不崩就成功了. 求大神帮小弟改下程序,现在总是会崩掉. http://pan.baidu.com/s/1bnw7zMR

引用 3 楼 cbzjzsb123 的回复:[quote=引用 2 楼 rand_srand 的回复:] [quote=引用 1 楼 lovesmiles 的回复:] k1是用来生成随机种子的，k2是用来将这个随机种子所生的伪随机数列移动到第k2位。  使得下一个rand()函数是第k2+1的伪随机数。  k3没有用，k4没有用，k5也没有用。就这样..................................... 没用那为什么还要写它呢？[/quote] 谁写的代码你去问谁啊，又不是他写的，你问他为什么要写有什么用[/quote] 书上写的，我以为肯定有用，只是自己没搞明白，所以想问问

引用 2 楼 rand_srand 的回复:[quote=引用 1 楼 lovesmiles 的回复:] k1是用来生成随机种子的，k2是用来将这个随机种子所生的伪随机数列移动到第k2位。  使得下一个rand()函数是第k2+1的伪随机数。  k3没有用，k4没有用，k5也没有用。就这样..................................... 没用那为什么还要写它呢？[/quote] 谁写的代码你去问谁啊，又不是他写的，你问他为什么要写有什么用

引用 1 楼 lovesmiles 的回复:k1是用来生成随机种子的，k2是用来将这个随机种子所生的伪随机数列移动到第k2位。  使得下一个rand()函数是第k2+1的伪随机数。  k3没有用，k4没有用，k5也没有用。就这样..................................... 没用那为什么还要写它呢？


Question: [求助]关于扩展欧几里德算法求模逆元问题

怎么解决的？

自己搞定了!

自己顶一个!!!!!!!!!!!!!!!!!!!!!!


Question: 欲读《数据结构与算法分析》，求前提知识提点

额。。。这个貌似是大学开的课程里面的《高等数学》。不知道现在课改高中课程有没有。不过这个基础不会的话编程以后会有很大阻力滴。。

楼主应该去听高中数学。  早知道吃完第七个包子就饱了，我为什么还要吃前六个包子呢？！  希望楼主不要犯这种低级错误。

《高中数学》


Question: 判断是否ESC按下，是则return pHead；不知道是检测不出按键还是其他错误，就是退不出子函数

2楼代码不行，应改为： pStu create_stu(void) {     pStu pHead=NULL, pNew=NULL;     int i,len=0,k;     char s[256];      pHead = (pStu)malloc(sizeof(Stu));     if(NULL == pHead) {         printf ("创建失败!\n");         exit(-1);     }      pStu pTail = pHead;     pTail->pNext = NULL;       printf("请按顺序输入学生的\n学号\t姓名\t分数(语,数,英)\t性别\t年龄\t籍贯\n");      for(i=0; i< STU_NUM; i++) {         pNew = (pStu)malloc(sizeof(Stu));         if(NULL == pNew) {             printf ("创建失败!\n");             exit(-1);         }         while (1) {             if (_kbhit()) {                 k=_getch();                 if (0==k||0xe0==k) getch();//功能键             } else break;         }         printf ("请输入第%d个学生的信息（按Esc键退出!）:\n", i+1);          k=_getche();         if (0==k||0xe0==k) {getch();k=0;}//功能键         if (27==k) return pHead;         if (k>0) {             s[0]=k;             fgets(s+1,255,stdin);         } else {             fgets(s  ,256,stdin);         }          if (2!=sscanf(s,"%d%s",   &pNew->iNumber, &pNew->cName))                         {printf("格式错误!\n"); return pHead;}         if (3!=scanf("%d%d%d", &pNew->iGrade[0], &pNew->iGrade[1], &pNew->iGrade[2])) {printf("格式错误!\n"); return pHead;}         if (1!=scanf("%s",     &pNew->cSex))                                          {printf("格式错误!\n"); return pHead;}         if (1!=scanf("%d",     &pNew->iAge))                                          {printf("格式错误!\n"); return pHead;}         if (1!=scanf("%s",     &pNew->cAdress))                                       {printf("格式错误!\n"); return pHead;}           pTail->pNext = pNew;         pNew->pNext = NULL;         pTail = pNew;     } }

pStu create_stu(void) {     pStu pHead=NULL, pNew=NULL;     int i,len=0,k;      pHead = (pStu)malloc(sizeof(Stu));     if(NULL == pHead) {         printf ("创建失败!\n");         exit(-1);     }      pStu pTail = pHead;     pTail->pNext = NULL;       printf("请按顺序输入学生的\n学号\t姓名\t分数(语,数,英)\t性别\t年龄\t籍贯\n");      for(i=0; i< STU_NUM; i++) {         pNew = (pStu)malloc(sizeof(Stu));         if(NULL == pNew) {             printf ("创建失败!\n");             exit(-1);         }         while (1) {             if (_kbhit()) {                 k=_getch();                 if (0==k||0xe0==k) getch();             } else break;         }         printf ("请输入第%d个学生的信息（按Esc键退出!）:\n", i+1);          k=_getch();         if (0==k||0xe0==k) {getch();k=0;}         if (27==k) return pHead;         if (k>0) _ungetch(k);          if (2!=scanf("%d%s",   &pNew->iNumber, &pNew->cName))                         {printf("格式错误!\n"); return pHead;}         if (3!=scanf("%d%d%d", &pNew->iGrade[0], &pNew->iGrade[1], &pNew->iGrade[2])) {printf("格式错误!\n"); return pHead;}         if (1!=scanf("%s",     &pNew->cSex))                                          {printf("格式错误!\n"); return pHead;}         if (1!=scanf("%d",     &pNew->iAge))                                          {printf("格式错误!\n"); return pHead;}         if (1!=scanf("%s",     &pNew->cAdress))                                       {printf("格式错误!\n"); return pHead;}          pTail->pNext = pNew;         pNew->pNext = NULL;         pTail = pNew;     } }

顶了，请大家帮忙看看！怎么改？？？

恩恩  谢啦，已经解决了！！！我这个函数写的没错，只是在调用它的函数中少写了一行代码，然后再写错两行代码的顺序。结构害我折腾一上午！！！现在已经好了，谢啦！！！


Question: open source 编译问题

使用Filemon工具软件。

make的时候一般会有log的，里面应该能看出哪些文件被编译了。


Question: 用c语言编写一个魔方矩阵

在http://www.codeproject.com搜“Magic Cube” ？

这年头伸手党怎么这么多。。。

百度知道里的伸手党更多,且个别道德败坏...

只说思路： 先实现输出N*N魔方矩阵，然后再考虑其他条件