Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求教关于rand（）生成均匀分布随机数的一些问题

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <time.h> unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } unsigned __int64 ullrand(void) {     return (      (((unsigned __int64)ulrand())<<32)     | ((unsigned __int64)ulrand())); } int i; unsigned long ul; unsigned __int64 ull; void main() {     srand(time(NULL));     for (i=0;i<10;i++) {         ul=ulrand();         printf("%010lu 0x%08x\n",ul,ul);     }     for (i=0;i<10;i++) {         ull=ullrand();         printf("%020I64u 0x%016I64x\n",ull,ull);     } } //3971076432 0xecb1d150 //2433428051 0x910b2a53 //1415415336 0x545d8628 //1312330759 0x4e389407 //1845758378 0x6e0409aa //0008069933 0x007b232d //4202720757 0xfa806df5 //2669855255 0x9f22c217 //0312068736 0x1299ca80 //2084555989 0x7c3fccd5 //03502077880857307931 0x3099e1472040ab1b //16884702393146816355 0xea52835e19b43763 //01877364819396611730 0x1a0dbd5b45f34e92 //07839440151924835771 0x6ccb4948756a05bb //09471412086917299176 0x8371371c820bfbe8 //04411255971577469925 0x3d37edef2f321be5 //13735846279546091130 0xbe9f876a65b7367a //04512980766520059820 0x3ea15418aa9927ac //15821377118299441610 0xdb90d2a9f1bb49ca //15512417228822200185 0xd7472d480398bf79

user: user-2
content: windows下用rand生成的随机数最大值只有RAND_MAX（通常被定义为32767）

user: user-3
content: windows下的rand()的最大值是32767，用来生成0 - 4294967295 是比较坑的。

user: user-3
content: 可以试试c++11的随机数生成器，可以生成各种分布的伪随机数 http://zh.cppreference.com/w/cpp/numeric/random

user: user-4
content: 随机函数产生的数本身就是随机的，若要均匀分布，可以先随机产生50以内的随机值，然后加上一个起始位置，比如要实现1000~50000之间的随机值，那么产生50以内的随机值，然后加上1000， 2000， 3000...59000
user-0 提问: 求大佬解释翻译一下

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

回复:
user: user-1
content: 仅供参考：#pragma comment(lib,"version") #include <windows.h> #include <stdio.h> void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      len=(int)(*(WORD *)buf);     printf("0x%08X bytes:\n",len);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j+=2) {                 sprintf(binstr,"%s%C",binstr,(buf[j]<=0x20&&buf[j+1]==0)?L'.':*(wchar_t *)&buf[j]);             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j+=2) {             sprintf(binstr,"%s%C",binstr,(buf[j]<=0x20&&buf[j+1]==0)?L'.':*(wchar_t *)&buf[j]);         }         printf("%s\n",binstr);     } } int main(int argc,char **argv) {     DWORD             dwVerHnd;     DWORD             dwVerInfoSize;     VS_FIXEDFILEINFO *pFileInfo;     LPVOID            lpvMem;     HANDLE            hMem;     unsigned int      uInfoSize;     WORD              m_nProdVersion[4];      if (argc<2) {         printf("Usage: %s fullpathfilename.ext [dumpall]\n",argv[0]);         return 1;     }     dwVerInfoSize = GetFileVersionInfoSize(argv[1], &dwVerHnd);     if (dwVerInfoSize) {             hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);             lpvMem = GlobalLock(hMem);             GetFileVersionInfo(argv[1], dwVerHnd, dwVerInfoSize, lpvMem);             VerQueryValue(lpvMem,"\\",(void**)&pFileInfo, &uInfoSize);             m_nProdVersion[0]=HIWORD(pFileInfo->dwProductVersionMS);             m_nProdVersion[1]=LOWORD(pFileInfo->dwProductVersionMS);             m_nProdVersion[2]=HIWORD(pFileInfo->dwProductVersionLS);             m_nProdVersion[3]=LOWORD(pFileInfo->dwProductVersionLS);             printf("The file [%s]'s version: %d.%d.%d.%d\n",argv[1],                 m_nProdVersion[0],                 m_nProdVersion[1],                 m_nProdVersion[2],                 m_nProdVersion[3]);             if (argc>2) {//dumpall                 HexDump((char *)lpvMem,dwVerInfoSize,0);             }             GlobalUnlock(hMem);             GlobalFree(hMem);     } else {         printf("Can not GetFileVersionInfoSize(%s,...)!\n",argv[1]);     }     return 0; }

user: user-2
content: 右键属性就可以啊

user: user-3
content: 去下载一个PEID可以查看

user: user-4
content: 我记的有！具体的名字忘了 exe dll 其实是pe格式的可执行文件，了解一下pe文件！
user-0 提问: 求组 为什么乱码

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-2
content: 出现乱码的原因，应该是输入p->name时前加了&

user: user-2
content: #include<stdio.h> #include<malloc.h> #include<stdlib.h>  #define STUDENT struct stu  #define LEN sizeof(STUDENT)  STUDENT{     int num;     char name[16];     char sex;     int age;     double grade;     STUDENT *next; };  STUDENT *create() {     STUDENT *head,*p1;     p1 = (STUDENT *)malloc(LEN);     if (!p1)         exit(0);     scanf("%d%s %c%d%lf", &p1->num, p1->name, &p1->sex, &p1->age, &p1->grade);     head = NULL;     while(p1->num != 0){         p1->next=head;         head=p1;         p1=(STUDENT *)malloc(LEN);         scanf("%d%s %c%d%lf",&p1->num, p1->name,&p1->sex,&p1->age,&p1->grade);     }     free(p1);     return(head); }  void print(STUDENT *head) {     STUDENT *p;     p = head;      if(!head)         return;      do{         printf("%d%s%c%d%lf\n",p->num,p->name,p->sex,p->age,p->grade);         p=p->next;     }while(p!=NULL); }  STUDENT *del(STUDENT *head, int age) {     STUDENT *p1,*p2;      if(head==NULL){         printf("\nlist null! \n");         return(head);     }     p1 = head;     while(age != p1->age && p1->next!=NULL){         p2 = p1;         p1=p1->next;     }     if(age==p1->age){         if(p1 == head)             head = p1->next;         else             p2->next = p1->next;         printf("delete:%d\n",age);         free(p1);     }     else         printf("%d  not been found\n",age);     return(head); } int  main() {     STUDENT *head,*s;     int del_age;     head=create();     print(head);     printf("\ninput the deleted age:");     scanf("%d", &del_age);     if (del_age != 0){         head = del(head,del_age);         print(head);     }      system("pause");     return 0; } 参考一下吧  问题有多处，首先：scanf("%d%s %c%d%lf", &p1->num, p1->name, &p1->sex, &p1->age, &p1->grade);p->name前不需要&，因为数组名本身就是地址；建议在%s和%c中间加一个空格，这样再输入name之后输入sex（一个字节）之前可以加一个空格，然后再输入sex；grade定义的是double类型，因此输入和输出格式应该是%lf  第二个问题：删除操作时，del_age，age年龄没有定义成double，从结构体定义的int类型，因此为了保持一直，建议定义成int类型； 第三个问题：删除函数所在的循环里，应该用if而不是用while，因为若删除结束后,del_age还是原来的值，这样容易造成死循环； 第四个问题：删除操作时，应该是判断要删除的是头节点还是其他节点，因此判断头结点和其他节点是两个分支，因此要用else if(p1 == head)             head = p1->next;         else             p2->next = p1->next;
user-0 提问: 新人请教，鸡兔同笼代码问题

回复:
user: user-1
content: 循环跑，符合条件停止

user: user-2
content: 引用 4 楼 Lzinner 的回复:#include<stdio.h> int main() {int a,b,x,y; printf("输出的头和脚的总数分别为:"); scanf("%d %d",&x,&y); a=(4*x-y)/2; b=(y-2*x)/2; printf("鸡有%d只,兔有%d只",a,b);a,b;}   这样就可以了code block写的    没有#include<stdlib.h> system("pause");  scanf-s

user: user-2
content: #include<stdio.h> int main() {int a,b,x,y; printf("输出的头和脚的总数分别为:"); scanf("%d %d",&x,&y); a=(4*x-y)/2; b=(y-2*x)/2; printf("鸡有%d只,兔有%d只",a,b);a,b;}   这样就可以了

user: user-3
content: 兔子数=(腿数/2)-头数； 鸡数=头数-兔子数

user: user-4
content: https://zhidao.baidu.com/question/109971768.html 经典题，解法不唯一。

user: user-5
content: 不用循环 直接砍掉2×头的腿数 /2 就得到兔
user-0 提问: 二维数组做参数如何不改变二维数组

回复:
user: user-1
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

user: user-2
content: 引用 3 楼 cfjtaishan 的回复:要想不改变，那么定义的函数里不对数组做修改就是了。这个可以自己控制的。如果是别人的写的接口函数，还想不让他改变，那么你在传入参数之前拷贝一下，即用数组的副本作为实参传入函数里，即使函数里对副本做了修改，但也不会修改原本数组的内容； 还可以把形参加上const修饰，这样函数里对数组内容修改，会有提示，编译会提示；这样就不用数组副本了。

user: user-2
content: 要想不改变，那么定义的函数里不对数组做修改就是了。这个可以自己控制的。如果是别人的写的接口函数，还想不让他改变，那么你在传入参数之前拷贝一下，即用数组的副本作为实参传入函数里，即使函数里对副本做了修改，但也不会修改原本数组的内容；

user: user-3
content: const int (*a)[maxsize] 呢？

user: user-4
content: 你的 ispoint 函数为什么要改变数组值呢？可不可以修改ispoint函数里的代码，让他不要修改。如果不能的话，可以每次调用时复制一个数组给他
user-0 提问: Linux下用TCP做一个聊天小程序，结果客户端在使用登录功能再退出后导致服务器也退出

回复:
user: user-0
content: 谢了，错误自己找到了，是由于客户端关闭套接子关闭，而服务器仍在接受无效的套接子，导致服务器崩溃。再读取套接字步骤加个判断条件就行

user: user-1
content: http://blog.sina.com.cn/s/articlelist_1595473800_6_1.html

user: user-2
content: 结构体定义呢？代码不全

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

user: user-2
content: 从服务器代码里看不出有正常退出的接口，因此很有可能是链表操作的地方有逻辑问题，导致服务器异常退出；

user: user-4
content: 服务器崩了？

user: user-0
content: 我的服务器代码没有给出退出条件啊  没有给return也没有exit

user: user-0
content: 以上为结果图，，在不使用登录的情况下退出，服务器不退出，但在使用登录功能之后再退出客户端将导致服务器退出
user-0 提问: 调用不同文件中的函数时总是build失败

回复:
user: user-1
content: 把所有文件都添加到工程中，保证文件都在同一目录

user: user-2
content: 文件（.h和.c）应该放在同一个目录下

user: user-3
content: 应该是编译没有编译到function.c，或者没有找到function.c。确认一下是否加载function.c和编译function.c

user: user-4
content: 把所有.c添加到当前项目的源文件中。
user-0 提问: 串口数据接收问题

回复:
user: user-1
content: 定义一个缓冲区buffer，之后记得要加CRC校验。 数据总会接收完的吧，最后一个字节是以什么结尾，\r\n? 那不就简单了

user: user-2
content: 不明白你想做什么，存数组和不存数组没有区别，都已经叫做串口了自然就是一个一个的发，一个一个的收，按照你规定好的通信协议，在把接受到的数据进行处理，可以设置串口的缓冲区，但那也是一个一个的收的，只是收完之后在一起给你，前提也是你知道接受多少数据之后来处理，如果数据的长度是可变的，还是每发送一个就接收一个的好

user: user-3
content: 用类似modbus这样的协议吧..

user: user-0
content: 好吧，我想复杂了，可以定义一个大些的数组，全部接收过来，再打印。还有一个方法是使用字符串类定义std::string strbuf；strbuf不断累加即可。

user: user-4
content: 参考《编译原理》中的词法分析和有限状态自动机。

user: user-5
content: 你这个问题问得是嵌入式程序处理吧？

user: user-6
content: 1.一次把发送的数据全部接收 2.如果是一个字符一个字符接收，那当输入缓冲区为空的时候就代表接收完成了吧

user: user-0
content: 引用 6 楼 qq_33462307 的回复:[quote=引用 5 楼 shaopengf 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 1 楼 shaopengf 的回复:] 一次发的数据长度是不确定的 定义一个数组（由于长度不确定，那么定义一个可能的较大的），然后把要发送的数据放入里面。需要注意或者担心什么？[/quote]还要对接收的数据进行处理，比如串口一次发过来的是02 30 0A 0B 1A 08，我接收后想把02 30 0A 0B 1A 08放在数组里转发出去，数的长度和类型都不确定，不是一个字节一个字节转发，类似于串口助手的自动换行？[/quote]  长度不确定就用动态数组啊,用vector 类型不确定是什么鬼，数组就是用来存储同一种数据结构的，类型不同是搞什么..  我的意思是如果你能一次把数据接收下来，那数据的大小就有了，重新申请数组也行，你为什么这么纠结自动换行啊，不就是一个\n吗？[/quote]是，不用纠结换行，重点是能把一次发的数据放数组里，怎么判断把发送的数据都存放在动态数组里了呢，然后就可以使用这个动态数组了

user: user-6
content: 引用 5 楼 shaopengf 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 1 楼 shaopengf 的回复:] 一次发的数据长度是不确定的 定义一个数组（由于长度不确定，那么定义一个可能的较大的），然后把要发送的数据放入里面。需要注意或者担心什么？[/quote]还要对接收的数据进行处理，比如串口一次发过来的是02 30 0A 0B 1A 08，我接收后想把02 30 0A 0B 1A 08放在数组里转发出去，数的长度和类型都不确定，不是一个字节一个字节转发，类似于串口助手的自动换行？[/quote]  长度不确定就用动态数组啊,用vector 类型不确定是什么鬼，数组就是用来存储同一种数据结构的，类型不同是搞什么..  我的意思是如果你能一次把数据接收下来，那数据的大小就有了，重新申请数组也行，你为什么这么纠结自动换行啊，不就是一个\n吗？

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 1 楼 shaopengf 的回复:] 一次发的数据长度是不确定的 定义一个数组（由于长度不确定，那么定义一个可能的较大的），然后把要发送的数据放入里面。需要注意或者担心什么？[/quote]还要对接收的数据进行处理，比如串口一次发过来的是02 30 0A 0B 1A 08，我接收后想把02 30 0A 0B 1A 08放在数组里转发出去，数的长度和类型都不确定，不是一个字节一个字节转发，类似于串口助手的自动换行？

user: user-0
content: 引用 2 楼 qq_33462307 的回复:你增大缓冲区吧，一次把数据全部接收过来，然后进行处理，虽然这不是个好办法.. 暂时没能想到如何判断出这个一次发送数据我这边还要对数据进行处理，比如一次发的是02 30 0A 0B 1A 08，我接收后想把02 30 0A 0B 1A 08放在数组里转发出去，而不是一个字节一个字节转发，有好方法吗

user: user-7
content: 引用 1 楼 shaopengf 的回复:一次发的数据长度是不确定的 定义一个数组（由于长度不确定，那么定义一个可能的较大的），然后把要发送的数据放入里面。需要注意或者担心什么？

user: user-6
content: 你增大缓冲区吧，一次把数据全部接收过来，然后进行处理，虽然这不是个好办法.. 暂时没能想到如何判断出这个一次发送数据

user: user-0
content: 一次发的数据长度是不确定的
user-0 提问: 求大神告知gets函数为什么也会出现烫

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-2
content: #include<stdio.h> #include<string.h>  void gb(char *y,char *m,int i);  int main () {     int i;     char y[100],m[100];     printf("enter i\n");     scanf("%d",&i);     getchar();    /* for '\n' */     printf("enter former char\n");     gets(y);     gb(y,m,i);     puts(m);     return 0; } void gb(char *y, char *m,int start) {     y += start;     while(*y)         *m++ = *y++;     *m = 0; } 参考一下吧  主要问题：.gets是遇到换行符即退出，由于上次输入i时，会将换行符'\n'残留在输入缓存里，因此在调用gets时就会遇到'\n'，直接返回，相当于什么字符也没有刷到内存数组y里。

user: user-3
content: 记到起.  看到  烫烫烫烫烫   1.  说明可能内存未初始化, 在未初始时, 默认是0xCC, 而两上0xCC0xCC连接起来, 正好是汉字  烫  的编码.  或者越界访问(一般是字符串没有加\0结尾).  越界同理, 访问到了未初始化的内存,

user: user-4
content: scanf后面加个getchar接收到最后的换行符\n，否则gets实际接收到的内容为空，导致m并没有正确设置结束符，故输出乱码

user: user-0
content: 引用 1楼自信男孩 的回复:#include<stdio.h> #include<string.h>  void gb(char *y,char *m,int i);  int main () {     int i;     char y[100],m[100];     printf("enter i\n");     scanf("%d",&i);     getchar();    /* for '\n' */     printf("enter former char\n");     gets(y);     gb(y,m,i);     puts(m);     return 0; } void gb(char *y, char *m,int start) {     y += start;     while(*y)         *m++ = *y++;     *m = 0; } 参考一下吧  主要问题：.gets是遇到换行符即退出，由于上次输入i时，会将换行符'\n'残留在输入缓存里，因此在调用gets时就会遇到'\n'，直接返回，相当于什么字符也没有刷到内存数组y里。受教了 谢谢您

user: user-0
content: 引用 2楼Zhanganliu 的回复:gets和scanf都会吃回车，这是个小trick，你可以去查查。受教了 感谢您

user: user-5
content: gets和scanf都会吃回车，这是个小trick，你可以去查查。
user-0 提问: C语言文件操函数问题，求指导

回复:
user: user-0
content: 就是第一次输入数据的时候，我该怎么办？我有些明白我的错了，我改一下再发上来

user: user-1
content: 楼主的代码看不懂呢，不论是查询还是修改，那么都需要有数据，用户数据和房间信息的数据，但是并没有找到从文件里读的操作，没有读操作，查询和修改就没有意义。 作为初学者，不建议是用goto语句，能用其他方式替代的，尽量使用其他方式；  在查询和修改前，需要将数据从文件里读到内存里，然后在内存里操作读取和修改。
user-0 提问: 我的第一个socket代码错哪了？

回复:
user: user-1
content: 我这里有一些，希望能有用： http://blog.sina.com.cn/s/articlelist_1595473800_2_1.html http://blog.sina.com.cn/s/articlelist_1595473800_6_1.html

user: user-2
content: 学会使用抓包软件wireshark

user: user-3
content: 有任何疑问就DEBUG，在recv哪里加个超时机制，看看每次recv返回值是多少

user: user-2
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-0
content: 引用 6 楼 赵4老师的回复:不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545 赵老师这几句话都发了好几年了。。。好多帖子都有这句话。。。   我这应该是使用recv循环接收阻塞的问题吧？      跟数据接收不全是两码事吧

user: user-4
content: 引用 4 楼 wodexiaojidan 的回复:[quote=引用 3 楼 wqte45 的回复:] [quote=引用 1 楼 wodexiaojidan的回复:]http是短链接，成功一次后要断开重新connect 不，你说的那是http 1.0年代的时候  现在都支持了，如果发一次，就重新连接太浪费资源了，而且手动提交数据后  还可以继续提交 也没看到服务器返回信息后 自动关闭连接啊  我觉得还是recv机制的问题[/quote]那你可以看下你的webservice服务端的源码，看下解析xml和生成xml的模块，我还第一次听说http不是短链接了[/quote]网上复制的“”但从 HTTP/1.1起，默认使用长连接，用以保持连接特性。使用长连接的HTTP协议，会在响应头有加入这行代码： Connection:keep-alive 在使用长连接的情况下，当一个网页打开完成后，客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭，如果客户端再次访问这个服务器上的网页，会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接，它有一个保持时间，可以在不同的服务器软件（如Apache）中设定这个时间。实现长连接要客户端和服务端都支持长连接。“”

user: user-4
content: 引用 3 楼 wqte45 的回复:[quote=引用 1 楼 wodexiaojidan的回复:]http是短链接，成功一次后要断开重新connect 不，你说的那是http 1.0年代的时候  现在都支持了，如果发一次，就重新连接太浪费资源了，而且手动提交数据后  还可以继续提交 也没看到服务器返回信息后 自动关闭连接啊  我觉得还是recv机制的问题[/quote]那你可以看下你的webservice服务端的源码，看下解析xml和生成xml的模块，我还第一次听说http不是短链接了

user: user-0
content: 引用 1 楼 wodexiaojidan的回复:http是短链接，成功一次后要断开重新connect 不，你说的那是http 1.0年代的时候  现在都支持了，如果发一次，就重新连接太浪费资源了，而且手动提交数据后  还可以继续提交 也没看到服务器返回信息后 自动关闭连接啊  我觉得还是recv机制的问题

user: user-5
content: 建议在服务器端看一下是否收到了page为2,3的http包 另外，注意Sleep(200)是不是时间间隔较短；

user: user-4
content: http是短链接，成功一次后要断开重新connect
user-0 提问: 最大值和次最大值下标问题

回复:
user: user-1
content: #include <stdio.h>  #define N 1000   int first_idx, second_idx;  void getMax12(int*a, int n) { 	int first_max, second_max; 	int i, j; 	first_max = a[0]; 	first_idx = 0;  	for (i = 1; i < n; i++) { 		if (first_max < a[i]) { 			second_max = first_max; 			second_idx = first_idx; 			first_max = a[i]; 			first_idx = i; 			break; 		} else if (first_max > a[i]){ 			second_max = a[i]; 			second_idx = i; 			break; 		} 	}  	//printf("%d %d", first_idx, second_idx);  	for (j = i + 1; j < n; j++) { 		if (first_max < a[j]) { 			second_max = first_max; 			second_idx = first_idx; 			first_max = a[j]; 			first_idx = j; 			//printf("+++%d %d", first_idx, second_idx); 		} else if (first_max != a[j] && second_max < a[j]) 		{ 			//printf("---%d %d", first_idx, second_idx); 			second_max = a[j]; 			second_idx = j; 		} 	} } int main() { 	int a[N], n, i; 	scanf("%d", &n); 	for (i = 0; i<n; i++) 		scanf("%d", &a[i]); 	getMax12(a, n); 	printf("%d %d", first_idx, second_idx); 	printf("\n"); 	return 0; } 参考一下吧。 可以多做机组数据测试；比如使用以下测试用例： 3 100 100 80  建议变量名不要随便的一个字母命名，最好能做到见名知义；
user-0 提问: gcc编译器运行结果正确，网上在线评测运行结果错误

回复:
user: user-0
content: 对的，昨天调试了一下，找到了这处错误

user: user-1
content: while(count > 0) 		putchar(result[--count]); 	putchar('\n'); 应该是cout==0导致的，其他地方没有问题。 注意前自减和自增都是先操作--或++

user: user-2
content: for (;count >= 0;) {	 putchar(result[--count]);}  当count等于0时--count为-1，越界了

user: user-0
content: 题目和网上在线评测结果
user-0 提问: acm题目,提交超时，大佬们看看有什么可以改进的地方

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  int GetOriNum(int data) { 	int tdata = data >= 0 ? data : -data; 	char s[16] = {0}; 	snprintf(s, sizeof(s), "%d", tdata); 	 	int len = strlen(s); 	int i, t, beg, retval = 0; 	 	int *a = malloc(len * sizeof(int));  	for(i = 0; i < len; ++i){ 		a[i] = s[i] - '0'; 	}  	int tag = 0; 	do{ 		for(i = 0; i < len - 1; ++i){ 			if(a[i + 1] < a[i]){ 				--a[i]; 				a[i + 1] +=10; 				tag = 1; 			} 		}  		if(tag == 0){ 			break; 		}; 		tag = 0; 	}while(1);  	retval = a[0] == 0 ? 0 : a[0]; 	for(i = 0; i < len - 1; ++i){ 		t = a[i + 1] - a[i];  		if(t >= 10){ 			return -1; 		}else{ 			retval = retval * 10 + t; 		} 	}  	retval = data >= 0 ? retval : -retval;  	free(a); 	a = NULL; 	 	return retval; }  int main(void) { 	int i, n;  	printf("Input:\n"); 	scanf("%d", &n); 	int *a = malloc(n * sizeof(int));  	for(i = 0; i < n; ++i){ 		scanf("%d", a + i); 	}  	printf("Output:\n"); 	for(i = 0; i < n; ++i){ 		printf("%d\n", GetOriNum(a[i])); 	}  	free(a); 	a = NULL;  	return 0; }  Input: 7 136 1 10 114514 1919 1107 1096 Output: 123 1 -1 103064 1729 999 989

user: user-2
content: n = (int)round(m / 1.111111111 + 0.5); 然后测试n、n + 1是否符合条件即可。

user: user-3
content: 从那么多的文字里没有看出魔法数字的算法，建议提供一下求魔法数字的算法。
user-0 提问: Dijkstra算法最短路径问题！！！已经找到了最短路径长度，但不知道如何输出最短路径所经过的顶点出来！！！

回复:
user: user-0
content: 引用 6 楼 sinat_37101089 的回复:在看《有趣的算法》一书中，也遇到这个问题，书中狄克斯特拉使用python实现，最终输出最短路径并没有提示。  思考后认为，狄克斯特拉优先处理最低消耗，处理完一个节点后进行记录，所以用来存储处理过节点的processed[]数组即为最短路径，供参考。  哈，很感谢帖子这么久了还关注呀， 你的方法可以一试。

user: user-1
content: 在看《有趣的算法》一书中，也遇到这个问题，书中狄克斯特拉使用python实现，最终输出最短路径并没有提示。  思考后认为，狄克斯特拉优先处理最低消耗，处理完一个节点后进行记录，所以用来存储处理过节点的processed[]数组即为最短路径，供参考。

user: user-2
content: 纳入新结点更新路径的时候顺便记录一下结点名字

user: user-0
content: 引用 3 楼 leetow2006 的回复:请教：图在计算机中怎么表示？  怎么表示？你是想把整个图表示出来？还是想把各个顶点的连接表示出来？

user: user-3
content: 请教：图在计算机中怎么表示？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:百度搜相关关键字。 好的，突然来了灵感了

user: user-4
content: 百度搜相关关键字。
user-0 提问: 嵌入式利用五向键改变日期

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。
user-0 提问: 求教如何从数组中读取用分号分开的数值，并转为整型传参

回复:
user: user-1
content: sscanf

user: user-2
content: 可以尝试char转换int

user: user-3
content: vector<string> lst; boost::algorithm::split(list, a[i],   boost::is_any_of(":")); if(list.size() > 1) {       int a = (int)(list[0]);      int b = (int)(list[1]); }

user: user-4
content: 可以使用sscanf，也可以使用strtok_r和atoi，当然也可以自己实现字符串转整型数的函数。
user-0 提问: 找不到源代码include的.h文件

回复:
user: user-1
content: 还可以给对方发邮件要代码。 万一对方有空呢

user: user-2
content: 继续百度、必应、谷歌、……

user: user-0
content: 引用 3 楼 user-3 的回复:源代码竟然不包括.h?! 看看是不是不同版本相对路径调整了我搜索了所有代码，没有这个文件名的文件啊...是源代码不完整吗？

user: user-0
content: 引用 2 楼 jiht594 的回复:还可以给对方发邮件要代码。 万一对方有空呢 其实我用的这个NetCDF是美国马里兰大学做的，貌似全球气象行业都在用这个...我估计联系人家是不会要到东西的...源代码里没有他引用的头文件是不是就是说代码不完整啊...

user: user-3
content: 源代码竟然不包括.h?! 看看是不是不同版本相对路径调整了
user-0 提问: while(!feof(in))问题

回复:
user: user-1
content: 在VC里，只有当文件位置指针到了文件末尾，然后再发生读/写操作时，标志位才会被置为含有_IOEOF，调用feof()才会得到文件结束的信息。正确写法参看：http://blog.csdn.net/woaisia/article/details/46441449

user: user-2
content: 引用 1 楼 jtidni 的回复:请问，这个-1，是怎么来的？ 这个博客可以解决你的若干问题：  http://blog.csdn.net/qq_29350001/article/details/53100563

user: user-0
content: 请问，这个-1，是怎么来的？
user-0 提问: 新手 求解

回复:
user: user-1
content: 函数若不指明类型，那么默认是int类型，所以编译器认为类型不匹配。指明sum的类型为double即可。

user: user-2
content: 把sum类型改成int类型或者改成double类型，统一double类型
user-0 提问: 课程设计中的一个问题

回复:
user: user-1
content: 其次，scanf("%c", &list[i].classify); 前面加一具getchar接收掉留在缓冲区中的\n，否则将会被你的list[i].classify接收

user: user-1
content: if (k = 1) 改成 if (k == 1)

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  #define LEN sizeof(struct list)  struct list {     char name[20];     long num;     char classify;     char email[53]; }list[200];  void save() {     FILE *fp;     if((fp=fopen("shuju","w"))==NULL)     {         printf("无法打开文件");         exit(0);     } }  int creat() {     int i;     printf("请输入信息，当输入姓名为end时停止录入\n");     for(i=0;;i++)     {         printf("姓名");         scanf("%s",list[i].name);         if(strcmp(list[i].name,"end")==0)             break;         printf("电话号码");         scanf("%ld",&list[i].num);         getchar();    /* for '\n' */         printf("选择分类：Ａ办公类　Ｂ个人类　Ｃ商务类");         scanf("%c",&list[i].classify);         printf("电子邮件");         //fflush(stdin);         scanf("%s", list[i].email);     }      return i; }  int main() {     int ch, cnt;     while(1)     {         printf("                    通讯录信息系统                    \n");         printf("                  请输入功能所对应的数字                 \n");         printf("|~~~~~~~~~~~~~~~~~~~~~~~~菜单~~~~~~~~~~~~~~~~~~~~~~|\n");         printf("|                  新增联系人信息(1)               |\n");         printf("|                查看所有联系人信息(2)             |\n");         printf("|                  查询联系人信息(3)               |\n");         printf("|                  修改联系人信息(4)               |\n");         printf("|                  删除联系人信息(5)               |\n");         printf("|~~~~~~~~~~~~~~~~~~~~退出系统(6)~~~~~~~~~~~~~~~~~~~|\n");         scanf("%d",&ch);         if(k==1) {             system("cls");             cnt = creat();         }     }      return 0; } 参考一下吧；  考虑结构体对齐，email定义成53字节。 考虑creat函数可以得到当前新增的个数，所以定义成有返回值，这个返回值可以被其他功能函数使用。 其他问题详见代码

user: user-0
content: 有没有人啊 搞了一下午了

user: user-0
content: 其他部分不要在意。。。刚开始做。
user-0 提问: 帮忙看一下这是个什么工程

回复:
user: user-1
content: 下载安装Visual Fortran试试 .for文件应该是Fortran源代码，你可以用记事本或其他的文本编辑器打开看看

user: user-2
content: 楼主可以打开里面的.exe文件，这是demo程序，看一下功能是怎么实现的

user: user-3
content: fortran语言？没用过。。。关注

user: user-4
content: 就是fortran程序，看它这列表里没有工程文件，你按它的说明直接修改.for，保存，再重新编译。既然你已经安装了vs和ivf，在命令行输入nmake heat.mak就可以了。
user-0 提问: vs2013的注释出现洋红色波浪纹

回复:
user: user-1
content: 逐个禁用各项，观察禁用哪一项后，注释中的红色波浪线消失。

user: user-0

user: user-1
content: 引用 10 楼 weixin_40442612 的回复:怎样把拼写检查关掉 VS2010的，VS2013没用过。

user: user-0
content: 怎样把拼写检查关掉

user: user-2
content: 这个是拼写检查吧

user: user-1
content: 将/* ... */ 替换为 #if 0 ... #endif 再试试？

user: user-0
content: 我知道这不是错误，但是看着不舒服，就想去掉 我把intellisense改成了true,可是还是没用

user: user-1
content: #include <string.h> #include <ctype.h>

user: user-3
content: 出现这些不一定是错误，是配置的问题。

user: user-4
content: 拼写检查，高亮福利啊

user: user-5
content: VS2013开启了拼写检查，所以出现  试试: 工具—选项—文本编辑器—C/C++—高级—Intellisense—禁用波形曲线 选项值改为（True）

user: user-0
content: 我没有按照番茄插件啊

user: user-6
content: 在 VAssistX菜单栏->Visual Assist X Options->Underlines->underlines spelling errors in comments and strings using
user-0 提问: c语言

回复:
user: user-1
content: 当i=1时： for(i=0;i<10;i++)中i=1; for(i=0;I++<10;)中i=2.

user: user-2
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-3
content: 不等价，你可以考虑下边界条件，当i = 10的时候，左边不会自加， 但右边会自加

user: user-4
content: 很明显不等价，这是因为i++造成的。 因为比较表达式每次都会执行， 比如i=0时，此时要比较i++<10不，此时i++表达式的值是0，满足条件，继续循环此时执行循环体，若循环体里运用i时，此时的i是1，因为i++;然后继续循环自增，此时i = 2; i++<10，此时i++是2，因此满足条件，此时i是3. 总之，若是第二个表达式那么循环体执行次数应该是减少一半。 建议此时一下，循环是打印"helloworld"，看看实际执行了几次。

user: user-5
content: 循环都是十次，但是最后i的值不一样

user: user-6
content: 你把for语句改成对应的while语句就明白了。
user-0 提问: [求助]c指向函数的指针问题,这两个错误怎么改?

回复:
user: user-0
content: 引用 1 楼 hdt 的回复:函数指针声明 返回类型 (*指针变量名)(参数列表)； 所以你定义的是错误的语法  double fun(float,float,int,double (*)(double)); 谢谢,那后面那个G:\C语言\A\a1.cpp(24) : error C2064: term does not evaluate to a function怎么解决?

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

user: user-2
content: 函数指针声明 返回类型 (*指针变量名)(参数列表)； 所以你定义的是错误的语法  double fun(float,float,int,double (*)(double));
user-0 提问: 关于C语言动态规划时的声明

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);

user: user-2
content: 使用全局变量是考虑在其他模块里也是用，全局变量是多个模块都可见的。并且生命周期是从定义开始到程序结束。  全局变量也有自己的缺点，那就是不利于分析全局变量的数据变化，因为它是多个模块都可见和使用。
user-0 提问: 单片机 59秒定时器  c语言  调试不成功

回复:
user: user-1
content: 写的太乱  有些寄存器都写错了

user: user-0
content: 引用 5 楼 user-2 的回复:单片机C语言很久没写过了  但你按我那伪码写不就没问题了吗 key = 1 按下的话  你把时间归零  同时打开计时寄存器  开中断 key =0 弹上的话，你就时间暂停计数，关闭计时寄存器，关闭中断 好的，谢谢

user: user-2
content: 单片机C语言很久没写过了  但你按我那伪码写不就没问题了吗 key = 1 按下的话  你把时间归零  同时打开计时寄存器  开中断 key =0 弹上的话，你就时间暂停计数，关闭计时寄存器，关闭中断

user: user-2
content: if(key== 1){    if(condition){       //do something    }else{     //do something    } }else {   if(condition){     //do something    }else{     //do something    } }

user: user-0
content: 引用 1 楼 user-2 的回复:主函数里面的开关事件问题太大了，你这样写，后面的key == 1或者key == 0怎么触发，永远只触发前面两个 请问应该如何修改呢？我的思路是开中断，关中断，重新计时

user: user-0
content: 请问应该如何改呢？我的思路是开中断，关中断，重新计时

user: user-2
content: 主函数里面的开关事件问题太大了，你这样写，后面的key == 1或者key == 0怎么触发，永远只触发前面两个
user-0 提问: c中用指向结构体的指针动态创建结构体数组

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  struct student { 	int age; 	char sex; }; int main() {  	int n; 	//student student1; 	struct student *p; 	scanf("%d", &n); 	p =(struct student *)malloc(sizeof(struct student)*n); 	p[0].age = 1; 	printf("%d\n", p[0].age); 	free(p); 	return 0; } 注意结构体使用时需要加上结构体名。 结构体的使用建议从课本上多看看使用，书本上的例子还是自己敲敲，调试一下。

user: user-2
content: #include<stdio.h> #include<stdlib.h> struct student { int age; char sex; }; int main() { int n; struct student *p; scanf("%d",&n); p=(struct student*)malloc(sizeof(struct student)*n); p[0].age=1; printf("%d",p[0].age); free(p); return 0; }  http://wenda.so.com/q/1392799083065014?src=140
user-0 提问: 这个程序怎么写，求教。

回复:
user: user-1
content: #include <stdio.h>  void GetCoins(int n) { 	if(n == 1){ 		printf("1"); 		return; 	}  	if(n == 2){ 		printf("2"); 		return; 	}  	if(n % 2){ 		GetCoins((n - 1) / 2); 		printf("1"); 	}else{ 		GetCoins((n - 2) / 2); 		printf("2"); 	} }  int main(void) { 	int n; 	scanf("%d", &n);  	GetCoins(n); 	printf("\n");  	return 0; }   下面这个对的

user: user-1
content: #include <stdio.h>  void GetCoins(int n) { 	if(n == 1){ 		printf("1"); 		return; 	}  	if(n == 2){ 		printf("2"); 		return; 	}  	GetCoins(n / 2);  	if(n % 2){ 		printf("1"); 	}else{ 		printf("2"); 	} }  int main(void) { 	int n; 	scanf("%d", &n);  	GetCoins(n); 	printf("\n");  	return 0; }
user-0 提问: 这个程序怎么写

回复:
user: user-1
content: #include <iostream>  int main() { 	char *p; 	char str; 	int result = 0; 	char recieve; 	int flag = 0; 	int forward = 0; 	while (true) 	{ 		recieve = getchar(); 		if (recieve != '\n') 		{ 			if (flag != 4) 			{ 				if (recieve == 'A'&&!result){ 					if (forward == -2){} 					else{ 						forward = 1; 						continue; 					} 					flag = 1; 				} 				else if (recieve == 'B'&&!result){flag = 2;} 				else if (recieve == 'C'&&!result){ 					if (forward == 2){} 					else{  						forward = -1;  						continue;  					} 					flag = 3; 				} 				else if (recieve != 'A'&&recieve != 'B'&&recieve!='C') 				{ 					flag = 4; 					result = 0; 				}  				switch (flag - 5 * result) 				{ 				case 1: 					if (forward == -2){ result = 1; flag = 0; forward = 0; } 					break; 				case 2: 					if (forward == 1){forward = 2;} 					else if (forward == -1){forward = -2;} 					break; 				case 3: 					if (forward == 2){ result = 1; flag = 0; forward = 0; } 					break; 				default: 					break; 				} 			} 		} 		else 		{ 			if (result)printf("true\n"); 			else printf("flase\n"); 			forward = 0; 			result = 0; 			flag = 0; 		} 	} 	return 0; }   写的有点复杂

user: user-2
content: 你可以改用malloc生成动态数组

user: user-0
content: 谢谢，先给你结帖吧，但题目要求不能使用数组呀。

user: user-2
content: #include <stdio.h> #include <string.h>  static const char *sub[] = {"ABC", "BCA", "CBA"};  int IsOkTheString(char *src, int sz) { 	int i;  	for(i = 0; i < sz; ++i){ 		if(src[i] < 'A' || src[i] > 'C'){ 			return -1; 		} 	}  	if(strstr(src, sub[0]) != NULL || strstr(src, sub[1]) != NULL || 			strstr(src, sub[2]) != NULL){ 		return 0; 	}else{ 		return -1; 	} }  int main(void) { 	char src[32] = {0}; 	fgets(src, sizeof(src), stdin); 	int len = strlen(src) - 1; 	src[len] = '\0'; 	 	if(IsOkTheString(src, len) == 0){ 		printf("true\n"); 	}else{ 		printf("false\n"); 	}  	return 0; }
user-0 提问: c primer plus 第十七章 第七题 c我认为有错误。

回复:
user: user-1
content: 上下文呢？。前因后果?

user: user-2
content: 左子树上所有结点的值均小于它的根结点的值

user: user-3
content: 没有上下文，不知道你在说什么。书里给出的答案是哪一项？

user: user-3
content: 左子树小于根节点，难道不是推出gate小于food？查找二叉树用于排序和搜索，它就是这么定义的！

user: user-1
content: 引用 6 楼 weixin_40895538 的回复:[quote=引用 3 楼 hdt 的回复:] 上下文呢？。前因后果? 一个查找二叉树，你看ｃ。ｇａｔｅ用ｓｔｒｃｍｐ排列是在ｆｏｏｄ后面的。结果出现在了根的左子树。你需要前因后果呀？[/quote] 932页呢？？ 934页呢？？

user: user-0
content: 引用 3 楼 hdt 的回复:上下文呢？。前因后果? 一个查找二叉树，你看ｃ。ｇａｔｅ用ｓｔｒｃｍｐ排列是在ｆｏｏｄ后面的。结果出现在了根的左子树。你需要前因后果呀？

user: user-0
content: 引用 2 楼 destory27 的回复:左子树上所有结点的值均小于它的根结点的值 于是您把我的话重读了一遍？

user: user-0
content: 引用 1 楼 hzy_76 的回复:左子树小于根节点，难道不是推出gate小于food？查找二叉树用于排序和搜索，它就是这么定义的！ #include<stdio.h> #include<string.h>  int main(void) {  printf("%d\n",strcmp("gate","food")); return 0; } 你回答我，你猜猜这里的值是大于０还是小于０？能不睁眼说瞎话吗？
user-0 提问: RAD studio XE2 如何编译一个C工程并调试运行和设置断点

回复:
user: user-1
content: 仅供参考：  怎样用C++ Builder（BCB）6.0编译无窗体的C++控制台应用程序 http://blog.163.com/tab_98/blog/static/1192409720169533811118/  C++ Builder（BCB）调试程序：设置断点，单步执行，观察、修改变量的值   http://blog.163.com/tab_98/blog/static/119240972017618111845352/  C++ Builder的问题最好发在C++ Builder区。
user-0 提问: 【求解】C语言学习问题，希望大家给点建议

回复:
user: user-1
content: 引用 1 楼 srhouyu 的回复:1. 一般自学编程的人很少去培训机构的。因为： a. 培训机构的老师水平并不怎么样，同时网上、书里高性价比的资源太多了。 b. 学习编程的过程中，“教”所占的分量很少，应当以“学”和“练”为主。“教”明显能起作用的时间至多是初入门的十几个小时。所以，即使学习班能够逼你去，你也收获有限。除非你惰性极强不逼不行。  2. 不懂C直接上C++完全可以。实际上还有好处，可以避免一些C时代的坏习惯。入门可以看《C++ Primer Plus 第六版》，配合《C++ Primer 第五版》。  3. 几乎不可能。PC平台上C语言和WinAPI手撸软件？除非你要做的软件几乎不需要界面。太麻烦了。初学者在PC上几乎不可能用C搞什么有用的开发。  自学编程还是找一个具体目标来驱动为好。如果你爱玩游戏，那么可以试试做游戏。实际上，我推荐以C#和Unity3D入门。最主要是C#容易而且Unity方便，所以开始几天内就能看到像模像样的成果，有助于顺利度过枯燥阶段。比如看《C#入门经典》、《Head First C#》，不止可以做游戏，也可以做桌面程序。学Unity网上有不少视频教程。  用C++和UE4的话，出成果还是要慢于C#和Unity的。  “培训机构的老师水平不怎么样” 这句话不赞同，能当老师的，尤其是在一个培训机构里，起码有几把刷子，如果自己都不懂怎么能教给别人的。如果自己有一定水平了，你可能会感觉老师讲的不怎么样，但是这个时候会有多少人去培训呢，占用时间和金钱；去培训的基本上是基础比较薄弱，所以是否选择培训要看自己缺的是哪方面（理论还是实践）。目前培训机构，一般会很抓实践，理论知识和实践的相结合，理论知识基本上在学校里学了一遍（如果用心学了）。从学校毕业后的学生，实践方面都是短板，所以通过培训可以在实践方面有一定的提高，至于提高多少要看自己的努力和领悟；  即使从培训机构里毕业了，那也只能让自己养成一个编程的习惯，好一点的能够学到一些编程思想，因为培训机构里的老师，至少有一些是有项目经验，所以在编程方面会给学生一些建议，但是这些建议只有自己在工作中逐步领悟和实践才行。所以，工作了也需要不停的学习和编程来总结经验和教训。

user: user-2
content: http://www.itheima.com/

user: user-3
content: 有问题： 翻书——上机实验——百度——论坛

user: user-4
content: 引用 2 楼 in85803586 的回复:但是问题是不去培训机构的话，遇到问题没人解决，然后就学不下去了  即使你已经搞了好几年编程，仍然会不停地遇到问题且没人帮你解决。若是自学关过不了，自然不可能踏上编程之路。

user: user-3
content: 看书 　　/  \    /    \ 练习——理解   有问题： 翻书——百度——论坛

user: user-0
content: 但是问题是不去培训机构的话，遇到问题没人解决，然后就学不下去了

user: user-5
content: 看视频，看书，论坛，百度。忘了说了，还有QQ群，豆瓣，百度贴吧等地可以。CSDN的vip下载资源挺多的。里面除了书还有代码。   编程就是和代码打交道。  好的视频把代码放在显眼位置。查书中的代码就比较烦。   你可以先打打基础，多看代码，然后厚积薄发写些练习的程序，不懂就到论坛上问。

user: user-6
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-4
content: 1. 一般自学编程的人很少去培训机构的。因为： a. 培训机构的老师水平并不怎么样，同时网上、书里高性价比的资源太多了。 b. 学习编程的过程中，“教”所占的分量很少，应当以“学”和“练”为主。“教”明显能起作用的时间至多是初入门的十几个小时。所以，即使学习班能够逼你去，你也收获有限。除非你惰性极强不逼不行。  2. 不懂C直接上C++完全可以。实际上还有好处，可以避免一些C时代的坏习惯。入门可以看《C++ Primer Plus 第六版》，配合《C++ Primer 第五版》。  3. 几乎不可能。PC平台上C语言和WinAPI手撸软件？除非你要做的软件几乎不需要界面。太麻烦了。初学者在PC上几乎不可能用C搞什么有用的开发。  自学编程还是找一个具体目标来驱动为好。如果你爱玩游戏，那么可以试试做游戏。实际上，我推荐以C#和Unity3D入门。最主要是C#容易而且Unity方便，所以开始几天内就能看到像模像样的成果，有助于顺利度过枯燥阶段。比如看《C#入门经典》、《Head First C#》，不止可以做游戏，也可以做桌面程序。学Unity网上有不少视频教程。  用C++和UE4的话，出成果还是要慢于C#和Unity的。
user-0 提问: 结构体初始化

回复:
user: user-1
content: C++可以这样写，相当于赋值一个临时类对象（调用默认构造函数），C语言没有这种语法

user: user-0
content: 引用 5 楼 a1193561652 的回复:C++语法上是可以的。但是还不如写成PCB b();，或者PCB b; 那个PCB b = PCB();像是先创建了一个对象b，然后又由PCB()创建了一个零时对象，然后在把零时对象复制到b上去。 然后我觉得你想要的是这个PCB* b = new PCB();不过这样记得最后自己delete。  是这样的，我一般在函数头部把变量都定义好 比如 PCB b; vector<xx> ls = vector<>(); 如果有循环的话 for(xx;xx;xx) {    b = PCB();   ls.push_back(b); } 如果像你所说，那就需要在循环中 PCB b = PCB(); 我想只定义一次PCB b这个变量; 另外这次又同样引用了 vector<xx> ls = vector<>(); 其实是一个症状， 就是作为java程序员认为 vector<xx> ls;这样只是定义 ls 变量，他像C里的野指针，完全不能用；虽然我知道C++里并不是这样， 但我还是按照java的语法写了如上的语句，不知有何不好或引起什么问题亦或者在某种环境下根本编译不过去，恳求各位给予详细指点。

user: user-2
content: C++语法上是可以的。但是还不如写成PCB b();，或者PCB b; 那个PCB b = PCB();像是先创建了一个对象b，然后又由PCB()创建了一个零时对象，然后在把零时对象复制到b上去。 然后我觉得你想要的是这个PCB* b = new PCB();不过这样记得最后自己delete。

user: user-3
content: C不行，但是C++完全没毛病，只是多此一举。编译器如果支持C++11以上的版本，你可以用PCB b{}这种定义， Java这样做敢情把声明和定义严格区分了。

user: user-2
content: 还有，如果你要这样用的话，有时候可能要自己重写赋值操作符。

user: user-2
content: 引用 6 楼 antiwise 的回复:[quote=引用 5 楼 a1193561652 的回复:] C++语法上是可以的。但是还不如写成PCB b();，或者PCB b; 那个PCB b = PCB();像是先创建了一个对象b，然后又由PCB()创建了一个零时对象，然后在把零时对象复制到b上去。 然后我觉得你想要的是这个PCB* b = new PCB();不过这样记得最后自己delete。  是这样的，我一般在函数头部把变量都定义好 比如 PCB b; vector<xx> ls = vector<>(); 如果有循环的话 for(xx;xx;xx) {    b = PCB();   ls.push_back(b); } 如果像你所说，那就需要在循环中 PCB b = PCB(); 我想只定义一次PCB b这个变量; 另外这次又同样引用了 vector<xx> ls = vector<>(); 其实是一个症状， 就是作为java程序员认为 vector<xx> ls;这样只是定义 ls 变量，他像C里的野指针，完全不能用；虽然我知道C++里并不是这样， 但我还是按照java的语法写了如上的语句，不知有何不好或引起什么问题亦或者在某种环境下根本编译不过去，恳求各位给予详细指点。[/quote] 不会引起什么错误，就是中间做了一些无用的操作而已。 对于上面的代码，在循环里可以不用b = PCB();直接ls.push_back(b);就好了。

user: user-0
content: 我是之前一直写Java语言， 最近几年穿插着写点C++ ，像这样的用法我用了有好一段时间，有点强迫症的意思吧，我确认这样式可以的，只是求前辈指点这样的语句的标准说明

user: user-4
content: 有没有自己试一下，如果试了可以或者不可以，询问问题可以的。 像这种不知道是否可行，建议自己先编程试一下。

user: user-5
content: C++中好像可以，C應該不行。
user-0 提问: EMMM求助C语言问题

回复:
user: user-1
content: 除了函数名和变量名重名的问题之外，代码逻辑也有问题，以下是在你的基础上改的，参考一下吧  #include<stdio.h>  int zs(int); int sum(int a,int b); int s=0,i;  int main() {     int a,b;     printf ("输入两个数");     scanf ("%d%d",&a,&b);     s=sum(a,b);     printf ("%d-%d之间的所有质数的和为%d\n",a,b,s);      return 0; }  int sum(int a,int b) {     int s=0,i;     for(i=a;i<=b;i++)         if(zs(i)==1)             s+=i;     return s; } int zs(int n) {     int i ;     for (i=2;i<n;i++) {         if(n % i == 0)             return 0;     }     if(i >=n )         return 1; }

user: user-2
content: int a,b,sum; // sum换个变量名  s=sum(a,b);
user-0 提问: 怎么样将结果去重（子集和问题的结果）

回复:
user: user-1
content: #include <stdio.h> #include <algorithm>  int main() {     int myints[] = {10, 20, 20, 20, 30, 30, 20, 20, 10};      std::sort(myints, myints + 9);     auto pos = std::unique(myints, myints + 9);      for (auto ps = myints; ps != pos ; ps++) {         printf("%d\t", *ps);     }      return 0; }

user: user-2
content: 1、为什么c_sum+num[i]出结果了就return？不考虑c_sum+num[j]（j>i）的情况了吗？ 2、swap(num[i],num[j])有什么用？
user-0 提问: 字符串降序排列不用冒泡法大佬们帮我看下这样为什么不行

回复:
user: user-1
content: void func(char *s1, char *s2 int n)     /* s1为字符串的起始地址，        s2为新字符串的起始地址，        n为字符串的长度。        要求：s1串不能发生改变，        s2串存放新的字符串。        */ {      for (i = 0; i < n; ++i)    /*将字符拷贝至s2，后面对s2排序*/         s2[i] = s1[i];  /*对s2进行冒泡排序，除了首字符和尾字符。*/     for (i = 1; i < n - 1; i++)         for (j = 1; j < n - 1 -i - 1; j++)             if (s2[j] > s2[j+1]) {                 char tmp = s2[j];                 s2[j] = s2[j+1];                 s2[j+1] = tmp;             } #if 0     int i,j;     char *max,*p1=s1;      for(i=1;i<=n;i++,max++)         for(j=1;j<n-1;j++,p++) {*max=*p1>=*(p1+1)? *p1:*(p1+1);}     s2=max; #endif } 参考一下吧； s2接收的实参是数组（或动态malloc申请的空间）；

user: user-1
content: 建议提供一下实参，从形参看到都是指针，不清楚实参是数组还是指针。

user: user-2
content: max没有分配内存，肯定会崩掉，
user-0 提问: 关于输入缓存区的问题（图的邻接矩阵）

回复:
user: user-1
content: 首先标准输入缓存是属于行缓存，因此需要回车结束输入并将数据刷到内存里（若不回车，即输入换行符，输入的内容还在缓存里） 因此每次的输入要刷到内存，需要输入换行符，即回车；但是，回车不会跟着进入内存，它还会残留在输入缓存里，若是%d接收，那么这个换行符'\n'不会与它匹配，但是若是%c就会与之匹配，所以若不加getchar();就会让第一个%c接收上次输入之后残留在输入缓存里的换行符'\n'，加上getchar();就是为了接收或者匹配输入缓存里的'\n'的。这样后面的%c就会匹配新输入的数据。 主要是%c是接收一个字符，'\n'正好是一个字符。

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-3
content: getchar接收了上一次输出后留在缓冲区中的换行符\n，否则会被接下来的scanf("%c",&(*G).vexs[i]);接收了，也就是说如果不用getchar接收掉，后面scanf接收到的字符为\n
user-0 提问: 求助为什么这个程序的print（）用不了？

回复:
user: user-0
content: 引用 1 楼 hzy_76 的回复:什麽叫做“用不了”？粗略看了一下你的程序，你把一個局部變量的地址拿出來用了，要注意這塊内存的内容在InitStack函數結束後就變爲不確定了！你好我按照这个思路改后还是一样的，似乎是print的数字列那个地方的问题，注释掉后可以完成运行，但是在符号的那一个链栈中没有数据

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:初始化栈函数，返回局部变量，得到的栈信息是未定义的。因为stack是局部变量。 Stack* InitStack() {     Stack* a = (Stack *)malloc(sizeof(Stack));     if(!a) {         printf("fail!\n");         return NULL;     }         printf("success!\n");         a->opnd.base=NULL;         a->opnd.top=NULL;         a->optr.base=NULL;         a->optr.top=NULL;         return a; }你好我照着改了还是老样子

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:print用不了不一定是print的问题。这么长的代码，为什么不一个个功能写完就测试一下，保证写过的功能都没问题了，再继续写下一个功能。 如果等写完了，所有功能都“实现”了再去编译测试，如果有问题了，就很难知道是那块出了问题。因此，写代码可以考虑“稳打稳扎，步步为营“的策略。一个个功能写，一个个功能测试。最后出问题也能相对比较好的定位问题；我就是这么写的，测试发现是print函数读取数字列的时候好像读到了空指针

user: user-1
content: 初始化栈函数，返回局部变量，得到的栈信息是未定义的。因为stack是局部变量。 Stack* InitStack() {     Stack* a = (Stack *)malloc(sizeof(Stack));     if(!a) {         printf("fail!\n");         return NULL;     }         printf("success!\n");         a->opnd.base=NULL;         a->opnd.top=NULL;         a->optr.base=NULL;         a->optr.top=NULL;         return a; }

user: user-1
content: print用不了不一定是print的问题。这么长的代码，为什么不一个个功能写完就测试一下，保证写过的功能都没问题了，再继续写下一个功能。 如果等写完了，所有功能都“实现”了再去编译测试，如果有问题了，就很难知道是那块出了问题。因此，写代码可以考虑“稳打稳扎，步步为营“的策略。一个个功能写，一个个功能测试。最后出问题也能相对比较好的定位问题；

user: user-2
content: 什麽叫做“用不了”？粗略看了一下你的程序，你把一個局部變量的地址拿出來用了，要注意這塊内存的内容在InitStack函數結束後就變爲不確定了！
user-0 提问: C语言里定义变量

回复:
user: user-1
content: 变量需要遵循一个原则：先声明（定义）后使用原则； 第二个出错的原因，是因为在scanf("%c", &x);之前找不到x的声明，定义；把char x声明和定义放在scanf后面，那么x的作用域在scanf之后，之前是未知的。因此会有error

user: user-2
content: 你读取数的时候用的x，如果在读取语句之后在定义x变量就会出错

user: user-3
content: 先声明后赋值， 还没声明值应该还没办法输进去吧， 再说，x值都有了，说明存在，还需声明吗

user: user-4
content: char x是声明变量，在scanf中有给x赋值的语句，所以可以理解为在执行需要x的语句的时候，没有声明变量，机器根本不知道这个“x”是什么，所以报错

user: user-5
content: 都没有那个东西，怎么给它值呢？

user: user-6
content: 同意4楼，来迟一步

user: user-7
content: 变量使用前要先声明

user: user-8
content: 学习了,谢谢

user: user-9
content: C语言中变量必须先声明后使用，这样编译器才知道为变量分配相应大小的内存，否则没有相应的内存数据怎么存储

user: user-10
content: 举个例子：定义（char x）就好比数学中的定理，只有它存在，你才能去用它。不存在，你就不能用它。

user: user-10
content: 不报错的是因为先定义的x后输入x的值 报错的那个是因为先输入x的值都定义x
user-0 提问: 想问这个程序错哪了？

回复:
user: user-1
content: int N,i,j,count=0,flag=1; int a[100]; scanf("%d",&a[N]);   首先int N后 N没有初始化，是随机值，很大的概率大于100； 你定义的数组a是100个成员，那么你直接scanf到a[N]里，数组99%以上会越界，程序直接就终止了。

user: user-2
content: 代码不会说谎，错误的都是写代码的人

user: user-3
content: N没有赋值，所以N的结果是未定义的。

user: user-4
content: scanf("%d",&a[N]); 这句不好理解啊，N 是随机值，可能是一个很大的随机值，那么a[N];必定越界呢。越界程序就可以不能运行，直接异常退出； 另外，a[100]中的所有元素也都是随机值，那么下面的操作就不能理解了。 如果楼主是想做成，输入N和N个数组元素，然后求这N个元素中偶数的个数。可以考虑这样实现：  #include <stdio.h> #include <stdlib.h> #include <time.h>  int main(int argc, char *argv[]) {     int N,i,count=0;     int a[100];     scanf("%d", &N);      if (N > 100)         return 0;     srand(time(NULL));     for(i = 0; i < N; i++)     {         a[i] = rand() % 100;         printf("%d ", a[i]);         if (!(a[i] % 2))             count++;     }     putchar(10);     printf("total even numbers = %d\n", count);     return 0; }

user: user-5
content: 数组不需要取地址符吧

user: user-6
content: 单步调试、每走一步看看所有变量值、先确定哪里出错了。
user-0 提问: 关于数组名的疑问

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:a和&a仅仅只是指向的地址是相同的，但他们是完全不同类型的指针，前者是指向int类型的指针(int*)，后者是指向数组的指针（类型为int(*)[5]），在C++强类型的语言里，如果不强制转换，这样的代码直接不能通过编译，C允许指针的隐式转换，但多数编译器会给出警告，正确的写法是前者，数组名会退化为指向数组元素类型的指针。  谢谢斑竹大大的解惑.

user: user-1
content: a和&a仅仅只是指向的地址是相同的，但他们是完全不同类型的指针，前者是指向int类型的指针(int*)，后者是指向数组的指针（类型为int(*)[5]），在C++强类型的语言里，如果不强制转换，这样的代码直接不能通过编译，C允许指针的隐式转换，但多数编译器会给出警告，正确的写法是前者，数组名会退化为指向数组元素类型的指针。
user-0 提问: VS2015中FILE的结构体元素与之前版本的有区别吗？

回复:
user: user-1
content: https://docs.microsoft.com/en-us/cpp/porting/visual-cpp-change-history-2003-2015 在上面这个链接中，微软提到了很多 VS CRT API 的变更，其中有这么一段内容：引用FILE Encapsulation In previous versions, the FILE type was completely defined in <stdio.h>, so it was possible for user code to reach into a FILE and modify its internals. The stdio library has been changed to hide implementation details. As part of this, FILE as defined in <stdio.h> is now an opaque type and its members are inaccessible from outside of the CRT itself.

user: user-1
content: _Placeholder 就是占位的意思，说明真实结构被隐藏了。总之就是不要去引用，而是用 ftell、stat、fstat 去获取文件信息。

user: user-0
content: 嗯，多谢指导，不过VS各版本的定义也会改变，这很令人疑惑

user: user-2
content: 建议不要直接使用里面的成员，因为不同编译器（甚至同一编译器不同版本）的实现可能是完全不同的，这样写没有任何通用性，也不具备跨平台性。
user-0 提问: 新手问题，数组名，下标，偏移量

回复:
user: user-1
content: 一个是地址，一个是值，当然不一样

user: user-2
content: p[ i ]前加一个取地址符&应该也可以吧

user: user-3
content: 你可以理解为，在输入的int *p,这个p是地址，而p[i]是p偏移i后的值。前面都回答的不错，为什么没有给分呢？

user: user-4
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-5
content: p++打印的是指针地址作为10进制打印，p[i]打印指针指向的内容了，能一样吗

user: user-6
content: 如果改成p+i就好了。因为p+i是地址，p[i]是p偏移i*sizeof(int)个字节后地址的内容；

user: user-7
content: &p[ i ]？
user-0 提问: C语言题目求解：写出程序的执行结果

回复:
user: user-1
content: **** *  * *  * ****

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

user: user-3
content: #include <stdio.h> int main() {     int i, j, k=4;     for (int i=1;i<=k;i++)         printf("%c",'*');     printf("\n");     for (int i=1;i<=k-2;i++)     {         printf("%c",'*');         for (j=1;j<= k-2;j++)             printf(" ");         printf("*\n");     }     for (i=1;i<=k;i++)         printf("%c",'*');     printf("\n"); }  代码有中文字符，并且*不能是中文，否则需要是字符串了，因为一个中文字符至少占2个字符；

user: user-4

user: user-5
content: 不知道你的那个符号是*还是＊，如果是*结果是 **** *  * *  * ****

user: user-6
content: **** *  * *  * ****

user: user-5
content:  ? ＊ ? ＊ 
user-0 提问: 怎么在这个代码的基础上改成去掉首尾空格？

回复:
user: user-1
content: 引用 3 楼 my_dream_not_give_up 的回复:"自习男孩”    兄弟，你改的这个代码，干掉了我字符串里所有的空格。我要干掉首尾的空格。#include <stdio.h> #include <string.h>  void *remove_space(char *ptr) { 	int  beg, end; 	end = strlen(ptr) - 1;  	for(beg = 0; ptr[beg] == ' ' && beg <= end; ++beg); 	for(; ptr[end] == ' ' && end >= beg; --end);  	ptr[end + 1] = '\0';  	memcpy(ptr, ptr + beg, end - beg + 2);  	return ptr; }  int main(void) { 	char str[] = "   he  l l o   w or ld   !    "; 	remove_space(str);  	printf("str : %s, length = %d\n", str, strlen(str));  	return 0;  } str : he  l l o   w or ld   !, length = 23

user: user-0
content: "自习男孩”    兄弟，你改的这个代码，干掉了我字符串里所有的空格。我要干掉首尾的空格。

user: user-1
content: #include <stdio.h> #include <string.h>  void *remove_space(char *ptr) { 	char *pret, *p, *pb, *pe; 	int size;  	for(pret = ptr; *pret == ' ' && *pret != '\0'; ++pret);  	pb = pe = p = pret; 	for(; *p != '\0'; ++p){ 		if(*(p - 1) != ' ' && *p == ' '){ 			pb = p; 		}  		if(*p != ' ' && *(p - 1) == ' '){ 			pe = p; 		}  		if(pb < pe){ 			size = strlen(pe) + 1; 			memcpy(pb, pe, size); 			p = pe = pb; 		} 	}  	if(pb > pe){ 		*pb = '\0'; 	} 	 	size = strlen(pret) + 1; 	memcpy(ptr, pret, size);  	return ptr; }  int main(void) { 	char str[] = "   he  l l o   w or ld   !    "; 	remove_space(str);  	printf("str : %s, length = %d\n", str, strlen(str));  	return 0;  }  str : helloworld!, length = 11

user: user-2
content: #include <stdio.h> #include <stdlib.h> //干掉字符串里所有的空格 void *remove_space(char *ptr) {     char *p1,*p2;     for(p1=ptr;*p1!='\0';p1++)     {         while(*p1==' ')//如果这里是if的话就只能去掉一个空格         {             for(p2=p1;*p2!='\0';p2++)             {                 *p2=*(p2+1);             }         }     }     return ptr; }  char *remove_spaces (char *str) {     char *ptmp, *pnew;      ptmp = pnew = str;     while (*ptmp) {         if (*ptmp != ' ')             *pnew++ = *ptmp;         ptmp++;     }     *pnew = 0;      return str; }  int main() {     char a[50];     gets(a);     //printf("%s\n",remove_space(a));     printf("%s\n", remove_spaces(a));     return 0; } 参考一下吧； 使用一层循环就可以解决问题；
user-0 提问: 求助，在LINUX写了一个查找的函数，查找英文没问题，查找中文的时候输出了全部

回复:
user: user-0
content: 只要我输入汉字，所有汉字相关的数据都被输出了 ，不管我输入的是什么

user: user-0
content: 引用 3 楼 jianwen0529 的回复:[quote=引用 2 楼 jianwen0529 的回复:] 需要支持中文最好改用wchar_t进行存储 然后把strlen，strchr，strcpy等字符串操作函数修改为针对wchar_t类型的版本 printf这个函数同样需要[/quote]搞定了 谢谢

user: user-0
content: 引用 3 楼 jianwen0529 的回复:[quote=引用 2 楼 jianwen0529 的回复:] 需要支持中文最好改用wchar_t进行存储 然后把strlen，strchr，strcpy等字符串操作函数修改为针对wchar_t类型的版本 printf这个函数同样需要[/quote] 怎么改呢 查了一下char到wchar_t的转换 没怎么看明白 还是说直接把我程序里的char全改成wchar？

user: user-1
content: 一个中文字符占两个字节的话

user: user-2
content: 引用 2 楼 jianwen0529 的回复:需要支持中文最好改用wchar_t进行存储 然后把strlen，strchr，strcpy等字符串操作函数修改为针对wchar_t类型的版本 printf这个函数同样需要

user: user-2
content: 需要支持中文最好改用wchar_t进行存储 然后把strlen，strchr，strcpy等字符串操作函数修改为针对wchar_t类型的版本
user-0 提问: C语言问题求助：寻找阿姆斯特朗数

回复:
user: user-1
content: 若k位1，则!k就是0，若k为0，则!k为1； 0为假，非0为真。

user: user-2
content: ! 是取反的意思

user: user-3
content: 就是k为零的意思。k为0，!k 为真，；k非0，!k 为假
user-0 提问: 数组遍历问题？

回复:
user: user-1
content: ’10‘ ‘11’ ‘12’这三个不是字符，c语言会把它转换，所以你输出的是0，1，2 ，

user: user-1
content: 声明两个指针，char (*pa1 )[2][3]; char (*pa2)[3];用这两个指针遍历，会方便很多，可以看一下《C专家编程》，里面有详细的讲解。

user: user-0
content: 哦，原来是这样，谢谢回复。  引用 1 楼 cfjtaishan 的回复:10, 11, 12是两个字符，即字符串了。不能用%c输出；稍微改一下就可以：  #include <stdio.h>  int main(void) {     char a[2][2][3] = {         {             {'1','2','3'},             {'4','5','6'}         },         {             {'7','8','9'},             {'A','B','C'}         }     };     char *pa = &a[0][0][0];     int i = 0;     for(i = 0; i < 12; ++i)     {         printf("%c ",*(pa + i));     }     printf("\n");     return 0; }

user: user-2
content: %c输出的只是一个字符，如果你要输出"10"，你要按字符串输出（不过要在结尾补充\0）

user: user-3
content: 10, 11, 12是两个字符，即字符串了。不能用%c输出；稍微改一下就可以：  #include <stdio.h>  int main(void) {     char a[2][2][3] = {         {             {'1','2','3'},             {'4','5','6'}         },         {             {'7','8','9'},             {'A','B','C'}         }     };     char *pa = &a[0][0][0];     int i = 0;     for(i = 0; i < 12; ++i)     {         printf("%c ",*(pa + i));     }     printf("\n");     return 0; }
user-0 提问: valgrind检测内存，只有warning，请问是什么原因，怎么解决

回复:
user: user-1
content: https://stackoverflow.com/questions/13558067/what-does-this-valgrind-warning-mean-warning-set-address-range-perms 基本不用管

user: user-0
content: 里面就是==10222== Warning: set address range perms: large range [0x97a3f040, 0xa7cce682) (undefined) ==10222== Warning: set address range perms: large range [0x97a3f028, 0xa7cce69a) (noaccess)这两句，我再加哪些配置项能打印的全一些呢？谢谢各位大神了