Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请教 这段程序有什么问题

回复:
user: user-1
content: 得到的结果，不可预知！  返回局部变量的后果

user: user-2
content: 函数内，不要返回局部变量。

user: user-3
content: 这样的不到你想要的数据了 直接被销毁了

user: user-4
content: 恩 b是局部变量的 地址， 把地址传出去了， 但是函数结束的时候， 它所指向的内存 已经没了

user: user-5
content: b是局部变量，函数结束后就销毁了，不能作为返回值

user: user-6
content: 加static前缀的局部变量就另当别论了。

user: user-7
content: #include<stdio.h> #include<string.h> char *get(char *p) { 	static char b[100]; 	strcpy(b,p); 	return b; } int main() { 	char a[]="Hello"; 	char *c; 	c = get(a); 	printf("%s\n",c); 	return 0; }  函数的返回之有返回地址，返回copy，返回传进来引用,一般返回某个基本类型数据时候，即使是局部变量，也会以copy形式返回。而返回数组，都是是地址形式返回，局部变量返回地址是没有意义的。返回引用是最有有效的。
user-0 提问: 如何快速实现两个文件的拼接？

回复:
user: user-1
content: 在你的1.txt的文件夹里面新建一个bat文件，输入copy /b 1.txt+2.txt 3.txt 3.txt就是你想要的。没有比这更简单了的。

user: user-2
content: 文本文件的话， 可以使用IO重定向, 性能不保证。   //msdos type 2.txt >> 1.txt //linux  cat type 2.txt >> 1.txt

user: user-2
content: 大文件的话， 用内存映射吧。

user: user-3
content: 我水平低，只会最简单的 /*************************************************************************     > File Name: txtcat.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月11日 星期六 20时58分00秒  ************************************************************************/ #include<stdlib.h> #include<stdio.h> int main() { 	char ch; 	FILE *fp; 	FILE *fq; 	fp =fopen("a.txt","a+"); 	if(fp == NULL) exit(0); 	fq =fopen("b.txt","r"); 	if(fq == NULL) exit(0); 	while((ch =getc(fq)) != EOF) 	{ 		putc(ch,fp); 	} 	fclose(fp); 	fclose(fq); 	return 0; }

user: user-4
content: WinExec("cmd /c copy /b 1.txt+2.txt 12.txt",SW_HIDE);
user-0 提问: 判断三条边能不能组成三角形

回复:
user: user-1
content: 引用 2 楼 qq_21880407 的回复:为什么要用%lf, double   和  float 都是浮点数啊 double是8字节的，float是4字节。scanf是可变参数的函数，没有类型检查。 给scanf传进去的的是8字节的double指针，但是scanf并不知道这个指针的类型，它只是从%f判断把这个指针当作4字节的float指针来用。

user: user-2
content: 楼上正解。。。

user: user-3
content: 引用 2 楼 qq_21880407 的回复:为什么要用%lf, double   和  float 都是浮点数啊 浮点数的单精度和双精度 是两种不同的数据类型，记下来就就好了

user: user-0
content: 为什么要用%lf, double   和  float 都是浮点数啊

user: user-1
content: double要用%lf float用%f
user-0 提问: 还是linux多线程问题

回复:
user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-2
content: 进程本身的切换只是不太频繁，其实开销还好，对于网络下载，还有的问题，如果只有一连接，可能会限制一个连接速度，开多个线程速度会快一点，而且现在的cpu大部分是多核的了

user: user-3
content: 对多核有意义。

user: user-4
content: 如果线程很忙，被切换的频次不大。而且很多站点对单个连接的流量有上限，多线程可以增加流量上面的限制
user-0 提问: 折扣那里就是算不出来，答案应该是96

回复:
user: user-1
content: #include <stdio.h> void main() { 	int a=245,b=570,c=320,d=2,e=1,f=1,g,h,i; 	float k,l; 	/*l是消费总金额，而且下面计算l的时候有乘以0.1，应该声明为浮点型*/ 	printf("\t表一:\t购物清单\n"); 	printf("---------------------\n"); 	printf("商品\t单价\t个数\n"); 	printf("---------------------\n"); 	printf("T恤\t%d\t%d\n",a,d); 	printf("网球鞋\t%d\t%d\n",b,e); 	printf("网球拍\t%d\t%d\n",c,f); 	printf("---------------------\n"); 	printf("折扣:"); 	scanf("%d",&g);	 	h=a*d+b*e+c*f; 	l=h*g*0.1; 	printf("消费总金额\t￥:%.2f\n",l);     printf("实际交费:"); 	scanf("%d",&i); 	/*scanf() 中不要带有'\n'*/ 	k=i-l; 	printf("找钱:%.2f\n",k); 	/*k是浮点型，格式符应该是用%f*/  }   大概修改了下，这样运行就可以，还有你的折扣如果是要用带有小数的，就应该声明为float吧。

user: user-2
content: 看楼上。。。。

user: user-3
content: scanf的问题，不要随意加非输入控制符，尤其不要加\n——http://blog.csdn.net/u012421456/article/details/18501309

user: user-4
content: scanf("%.d\n",&i); 改成 scanf("%d",&i);

user: user-0
content: 应该是找钱那里，标题打错了！DD

user: user-4
content: 这很简单啊，你输入i的时候，可以跟踪到，它的值根本就不对嘛，你的%d里面多了一个点！！！ 这种问题一跟踪就搞定了啊，所以你还是先学会跟踪调试

user: user-0
content: 我已经搞了一晚上，不行才来论坛，谢谢！

user: user-4
content: 跟踪调试一下吧，这个自己动手进步才快

user: user-0
content: 就算改了也是一堆00000，求解！

user: user-4
content: k是float，你怎么%d输出？
user-0 提问: 简单的C语言程序中的一些小疑惑

回复:
user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 二楼就说的很对了。建议多看看C基础！

user: user-3
content: x，y没赋值，所以就显示是-858993460，你在输入r之前就把面积给计算了，这个逻辑就不对，所以会出错

user: user-4
content: 二楼解释很详细！

user: user-5
content: 看二楼。。。。

user: user-0
content: 劳烦各位大神如此详细的回复，谢谢，解决了我在学习语言的过程中的不懂的问题，谢谢。

user: user-6
content: 这个代码写的，c是面向过程的语言，要有先后

user: user-7
content: #include <stdio.h> # define PI 3.14f void main () {   int a,b,x,y;     a=1,b=2;     printf("a=%d,b=%d,x=%d,y=%d\n",a,b,x,y); 	// 首先，x y 没有初始化，直接打印出来的是乱码。    int r;   float area;   printf ("请输入你想要的圆的半径：\n");   scanf("%d",&r);// 只有你输入了数据才能进行计算。。。。    area =PI*r*r;   printf ("圆的面积为:%lf",area);   printf ("圆的面积为：%0.2lf",area);   // 其次，所有程序都是有main 函数开始，依照从上到下的顺序执行的。(跳转什么的就不提了)   //所以代码的位置是很重要的，在写代码的时候，一定要搞清楚，先干什么后干什么。  }

user: user-8
content: #include <stdio.h> #define PI 3.14f int main() {   int a,b,x,y;     a=1,b=2;     printf("a=%d,b=%d,x=%d,y=%d\n",a,b,x,y);    int r;   float area;   printf ("请输入你想要的圆的半径：\n");   scanf("%d",&r);   area =PI *r * r;   printf ("圆的面积为:%lf",area);   printf ("圆的面积为：%0.2f",area);  return 0; } x,y你不是赋值的话，还是会有一个随即值的，如果是静态变量，则默认是0，值域你说求面积，为什么是一个很大的数，不是314，因为你在没有给定r的时候就求面积了，这时候r是一个不可预测的数，算出来的面积但是不是314。把scanf语句放到求面积的语句前面就好了
user-0 提问: [字符数组和字符串数组]代码和运行结果如下,有些没想明白

回复:
user: user-1
content: 稍微改了一下，也不太合理，写代码思路要清晰 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>   #define MAXLINE    1024   int findnumstring (char *outputsr, char *inputstr) {     bool reset = false;     int i, j = 0, count = 0;     char *str[32] = {0};     char *temp;           for( i = 0;*(inputstr + i) != '\0';i++ )     {         if( *(inputstr + i) >= '0' && *(inputstr + i) <= '9' ) // '0'~'9'         {             reset = true;             count++;         }         else         {             if( reset )             {                 *(inputstr + i) = '\0';                 str[j++] = temp;                 printf("str[%d] = %s\n",j-1,str[j-1]);                 count = 0;                 reset = false;             }             temp = (inputstr + i + 1);         }     }     for(i = 0;str[i] != NULL;i++)         printf("str[%d] = %s\n",i, str[i]); }   int main(int argc, char **argv) {     char input[] = "abcd12345eee125sss123456789a";     char output[] = {0};       findnumstring(output, input);           exit(0); }

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-0
content: 引用 1 楼 xpdavis 的回复:str[j++] = temp; 改成 strcpy(str[j++], temp); 这样改的话,运行会出现段错误 - -

user: user-1
content: str[j++] = temp; 改成 strcpy(str[j++], temp);
user-0 提问: C 语言内存分配问题

回复:
user: user-0
content: 引用 2 楼 xpdavis 的回复:嗯，此外realloc(string,FinalLen);也不是这么用的，应该是： string = (char *)realloc(string,FinalLen); 恩恩，谢谢！

user: user-0
content: 引用 1 楼 Idle_ 的回复:你的代码中只要加个判断就会知道realloc必然失败（返回null）。   失败原因很简单： string变量指向的是栈上的空间，realloc分配的是堆上的内存，对堆管理器来说string指向的原始空间在堆上根本不存在。 因此调用后string还是原来那块空间，还是原来那些大小的合法空间，很明显你后面的操作会溢出，如果替换的空格少的话问题还不大，最多就是将传入参数给破坏了（加上debug版本下为防止溢出而在栈上多分配的那些空间），但是如果原始串中多些空格那么你的溢出操作必然破坏函数的返回地址 -- 结果就是return时找不到回家的路了，会跳到一个非法地址上引起程序崩溃。  恩恩，懂了，谢谢咯！

user: user-1
content: 你的代码我没看懂 /*************************************************************************     > File Name: replac.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月11日 星期六 19时36分06秒  ************************************************************************/ #include<stdlib.h> #include<stdio.h> #include<string.h> char * replace(char str[]); int main() { 	char string[] = "Hello csdn, I am new here! Take care after!"; 	char *res; 	res = replace(string); 	printf("%s\n",res); 	free(res); 	res =NULL; 	return 0; }  char *replace(char str[]) { 	int space_num=0; 	int i=0; 	int size; 	char *p; 	for(;i <strlen(str); i++) 	{ 		if(str[i] == ' ') 			space_num++; 	} 	size = strlen(str) + 2*space_num + 1; 	printf("%d\n",size); 	p = (char *)malloc(size); 	int j; 	for(i =0,j =0;i < strlen(str);) 	{ 		if(str[i] == ' ') 		{ 			p[j] ='%'; j++; 			p[j] ='2'; j++; 			p[j] ='0'; j++; 			i++; 		} 		p[j] = str[i]; 		j++; 		i++; 	} 	p[size] = '\0'; 	return p; }

user: user-2
content: 嗯，此外realloc(string,FinalLen);也不是这么用的，应该是： string = (char *)realloc(string,FinalLen);

user: user-3
content: 你的代码中只要加个判断就会知道realloc必然失败（返回null）。   失败原因很简单： string变量指向的是栈上的空间，realloc分配的是堆上的内存，对堆管理器来说string指向的原始空间在堆上根本不存在。 因此调用后string还是原来那块空间，还是原来那些大小的合法空间，很明显你后面的操作会溢出，如果替换的空格少的话问题还不大，最多就是将传入参数给破坏了（加上debug版本下为防止溢出而在栈上多分配的那些空间），但是如果原始串中多些空格那么你的溢出操作必然破坏函数的返回地址 -- 结果就是return时找不到回家的路了，会跳到一个非法地址上引起程序崩溃。
user-0 提问: 负数十进制转换成十六进制的问题

回复:
user: user-1
content: printf("%04hX\t",(short)arr[i]);

user: user-2
content: unsigned short哪来的符号？转到4字节整数以后，也是一样的

user: user-0
content: 引用 5 楼 xpdavis 的回复:对于unsigned short来说，-116就是FF8C，作为%X输出的时候，都是作为4字节整数的，所以还是FF8C 但如果是signed short，-116还是-116，作为%X输出的时候，就变成FFFFFF8C 那本身是带符号的数据结果强制转换成无符号的，感觉说不通啊，这里的FF8C最高位还表示符号吗

user: user-2
content: 对于unsigned short来说，-116就是FF8C，作为%X输出的时候，都是作为4字节整数的，所以还是FF8C 但如果是signed short，-116还是-116，作为%X输出的时候，就变成FFFFFF8C

user: user-0
content: 引用 2 楼 xpdavis 的回复:转义一下应该可以的 printf("%04X\t",(unsigned short)arr[i]); 不是负数吗，为什么要转化成无符号的呢，现在就这个不明白，求教！！

user: user-0
content: 引用 1 楼 user-3 的回复:printf("%x",arr[i] & 0xffff);这不就行啦 不是负数吗，为什么要转化成无符号的呢，现在就这个不明白，求教！！

user: user-2
content: 转义一下应该可以的 printf("%04X\t",(unsigned short)arr[i]);

user: user-3
content: printf("%x",arr[i] & 0xffff);这不就行啦
user-0 提问: (unsigned long)-MAX_ERRNO=-4095,即是0xFFFFF001 是如何换算的？

回复:
user: user-1
content: 呵呵，你真利害啊

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

user: user-0
content: 自己弄明白了。  在计算机中，负数以其正值的补码形式表达。  什么叫补码呢？这得从原码，反码说起。  　  原码：一个整数，按照绝对值大小转换成的二进制数，称为原码。  比如 00000000 00000000 00000000 00000101 是 5的 原码。  　  反码：将二进制数按位取反，所得的新二进制数称为原二进制数的反码。  取反操作指：原为1，得0；原为0，得1。（1变0; 0变1）  比如：将00000000 00000000 00000000 00000101每一位取反，得11111111 11111111 11111111 11111010。  称：11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。  反码是相互的，所以也可称：  11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。  　  补码：反码加1称为补码。  也就是说，要得到一个数的补码，先得到反码，然后将反码加上1，所得数称为补码。  比如：00000000 00000000 00000000 00000101 的反码是：11111111 11111111 11111111 11111010。  那么，补码为：  11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011   所以，-5 在计算机中表达为：11111111 11111111 11111111 11111011。转换为十六进制：0xFFFFFFFB。   再举一例，我们来看整数-1在计算机中如何表示。  假设这也是一个int类型，那么：   1、先取1的原码：00000000 00000000 00000000 00000001  2、得反码：     11111111 11111111 11111111 11111110  3、得补码：     11111111 11111111 11111111 11111111   可见，－1在计算机里用二进制表达就是全1。16进制为：0xFFFFFF
user-0 提问: 数字255到底占几个字节？

回复:
user: user-1
content: 如果你定义int型255就占4个字节 如果你定义char项就占1个字节 如果你定义double就占8个字节

user: user-2
content: 既然在C版问，那就有必要搞清楚一个前提： 1.ISO C的一个字节由char的大小定义，跟unsigned char、signed char是不同的类型但保证大小和对齐要求一致。 2.无符号数使用补码表示。 3.char具有CHAR_BIT位，CHAR_BIT不小于8。 1.2.3.unsigned char必然能放得下255这个数。 4.ISO C要求数字字符在基本源字符集和基本执行字符集中。 5.基本执行字符集中的每个字符必然能以一个字节表示。 4.5.“2”“5”“5”这三个字符可以在3个字节内放下。 6.考虑实现，一般使用7-bit的ASCII或EBCDIC作为基本字符集，对应的编码直接串接即可。 1.3.6.如果一个字节大于8位，这三个字符可能不用3个字节。 7.对于C标准库，以null terminate string表示的字符串（也适用于C的字符串字面量）末尾得加上一个字节的'\0'，所以对于这样的字符串，上面讨论字符的结果得加上一个字节。 8.以上使用的是直接串接字节的基本编码。兼容ASCII/EBCDIC的编码方案（如UTF-8）在这里不变。对于不兼容这些基本字符集对应编码的其它编码如UCS-2/UTF-16这样要求每个字符至少占用2个octet（8bit）的编码得按具体字节大小讨论。 9.其它什么奇偶校验的跟C无关。就算物理上得考虑多占用，对于C以上层次的用户来说是透明的，可以无视。

user: user-3
content: 引用 3 楼 zhao4zhong1 的回复:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。还是这个好

user: user-4
content: 字符集是一样的，目前大约有100万个码位。  但对这100万个码位有不同的编码方案，如utf8,utf16,utf32等。。。  同样的码位，用不同的编码方案，得到的长度就不同。  比如一个英文字符用utf8编码是1个字节，换用utf32编码就是4个字节  而一个常用汉字用utf16编码是两个字节，换用utf8编码就产生3个字节（楼主说的一个字符3个字节就是这个情况吧）

user: user-5
content: 为什么要纠结这个呢，需要的时候，看看内存就行了

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

user: user-7
content: 8位二进制数可以装下数字255   但是    数字255可以装进8位二进制（uint8_t）容器里边，也可以16位二进制(uint16_t)，也可以32位二进制(uint32_t),....................里边

user: user-0
content: 之所以有这个疑问是因为 csapp中有一句 大部分的现代系统都使用ASCII标准来表示文本字符，这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符 #         i        n        c      l       u       d        e 35   105    110   99   108  117  100   101
user-0 提问: 可以这样在函数中的参数为char *p时，用p[n]这种形式修改p所指字符串的内容吗？

回复:
user: user-1
content: 指针可以用下标的方法来访问

user: user-2
content: 如果在外部 char *p="hello world"这样，我知道不能更改。 但是如果 char*p = str; str是一个数组字符串，这样行吗？ 这里的"hello world"只是用来初始化p的，你可以修改p里面的东西，没有任何问题 同样的，str也是允许修改的。二者都没有涉及到修改常量串的问题啊？？？！！！  （背景：因为strncpy不能给des自动加'\0'，所以我用strncpy中修改char *p中的内容，希望在最末尾的后一位加‘\0’） strncpy可以给dest复制'\0'的，问题是你如果复制的字符串长度刚好等于参数指定的长度，它就不会复制'\0'

user: user-3
content: 就用下标来改，前提是允许修改才能改

user: user-4
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！
user-0 提问: 跪求C+RAM大神

回复:
user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-2
content: 引用 1 楼 baidu_15809401 的回复:(unsigned *)(_ISR_STARTADDRESS+0x4）得到一个unsigned的地址，再取*就是取地址指向的值，得到unsigned的数，但把一个指针数组赋给unsigned的数，怎么可能？  可能啊， 就看你后续如何使用了 u32 应该在哪里有重定义的  32位的 unsinged int  (u32)key_handler  就是把指针 转换为  unsinged的数

user: user-0
content: (unsigned *)(_ISR_STARTADDRESS+0x4）得到一个unsigned的地址，再取*就是取地址指向的值，得到unsigned的数，但把一个指针数组赋给unsigned的数，怎么可能？
user-0 提问: C语言程序中，如何理解栈是由编译器管理的？

回复:
user: user-1
content: 就是push   pop

user: user-2
content: 引用 6 楼 u014627144 的回复:[quote=引用 5 楼 lm_whales 的回复:]  你说得挺能解开我这个疑惑的，请问下哪里可以查看或者验证下呢~~[/quote]  要想彻底理解这些东西，编译原理，汇编语言，以及计算机组成与结构，这方面的知识都是需要了解的  X86堆栈，函数调用，数据暂存，以及函数局部自动变量，函数参数，都在使用 . 具体到 VC上，函数局部自动变量，函数参数，用一个固定的常量，表示函数相对栈帧的相对偏移量。 具体 读写，一般是通过寄存器间接寻址等方式 读写，大都是用 ebp 读写，有时候 优化后的代码，可能会用 esp 读写。 另外，32 Bits 代码，一般看不到设置堆栈的操作，  栈的位置通过 段寄存器 SS确定，SS一般不用设置， 所以堆栈段地址，以及堆栈基地址，这些在汇编代码里是看不到的。  能看到的堆栈操作，一般都是用 相应指令， 比较明显的就是 对 esp,ebp 这两个寄存器的使用。

user: user-2
content: 引用 6 楼 u014627144 的回复:[quote=引用 5 楼 lm_whales 的回复:] 编译器安排代码，代码自动管理。 当编译完成，代码生成以后，程序就脱离编译器了 。。。所以编译器并没有管理你的栈，是你的程序里，编译器安排的代码，在管理你的栈。  你说得挺能解开我这个疑惑的，请问下哪里可以查看或者验证下呢~~[/quote] 编译的时候，生成汇编代码，可以看到 push ,pop 指令，add esp,call ,ret 这里类指令 这些指令都是 操作堆栈的 还有一些代码，生成使用 ebp,esp寄存器的指令，这些也堆栈相关的指令 对于有堆栈操作的CPU，编译器会生成这一类指令操作堆栈,    这里，是以 X86 CPU ,32Bits 代码来说的， 汇编语言，按照 masm  汇编语言格式描述的。

user: user-3
content: 算是编译器解放了对于程序对于用到的数据的管理

user: user-0
content: 引用 5 楼 lm_whales 的回复:编译器安排代码，代码自动管理。 当编译完成，代码生成以后，程序就脱离编译器了 。。。所以编译器并没有管理你的栈，是你的程序里，编译器安排的代码，在管理你的栈。  你说得挺能解开我这个疑惑的，请问下哪里可以查看或者验证下呢~~

user: user-4
content: 反汇编就可以看到这些由编译器插入的与栈寄存器有关的指令，在X86上，它叫sp,esp或rsp，很好找的。  减一个数就表示分配，加一个数就表示回收。

user: user-4
content: 简单来说就是那个栈寄存器是由编译器负责维护的，编译器插入必要的指令对其操作，如分配，释放，建立存储位置与局部变量的对应关系等。。。

user: user-5
content: 嗯，你可以看编译出来的 汇编语言 基本那个局部变量 或 函数的参数地址 都固定好了

user: user-2
content: 编译器安排代码，代码自动管理。 当编译完成，代码生成以后，程序就脱离编译器了 。。。所以编译器并没有管理你的栈，是你的程序里，编译器安排的代码，在管理你的栈。

user: user-6
content: 如果不能理解，记住他就好了

user: user-7
content: 参考gcc源代码相关片断？

user: user-8
content: 堆栈用于存储局部变量和函数返回地址，这些显然是编译期间就能确定的，也自然是编译器管理的。  对应的是堆上的存储，因为这些是运行的时候动态分配的，编译器就无能为力了。
user-0 提问: 一阶常微分方程组边值问题的相关C语言程序

回复:
user: user-1
content: 想知道结果啊，打靶法可以解决一个参数变化的情况，两个以上的参数变化怎么求解？还没有思路

user: user-1
content: 楼主解决没有，我也想解决这个问题，有答案的话分享一下

user: user-0
content: 边值问题：当微分方程要求在自变量的两个或两个以上值上满足边界条件时，这种问题叫做两点边界问题。你说的去掉二阶部分，但是那个二阶的是一个方程，我现在要解决的是方程组，我看过资料说有打靶法和松弛法，但是我还是不太会编，请求指点啊！

user: user-2
content: 不过你先告诉我边值问题是什么，有点记不清了

user: user-2
content: 你把处理2阶的部分去掉不就结了

user: user-3
content: 微分还没开始学。。。
user-0 提问: TC到VC的代码移植

回复:
user: user-1
content: 不懂， 你的 graphics.h easyx.h 可以打开吗  里面有这个函数声明吗

user: user-2
content: 还是摒弃graphics.h和easyx.h学习windows.h吧： #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");         ohfont=(HFONT)SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-720, r.top+r.bottom/2-120,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; }
user-0 提问: 求助：windows查找指定日期的文件

回复:
user: user-1
content: typedef struct _WIN32_FIND_DATA {    DWORD dwFileAttributes;    FILETIME ftCreationTime;      //文件创建时间  FILETIME ftLastAccessTime;  //   FILETIME ftLastWriteTime;    //文件最后修改时间 DWORD nFileSizeHigh;    DWORD nFileSizeLow;    DWORD dwOID;    TCHAR cFileName[MAX_PATH];  } WIN32_FIND_DATA;   遍历所有文件, 然后用这两个时间来判断即可.  本身提供的API没有时间过虑功能, 甚至没有多种后缀过虑功能.

user: user-2
content: WinExec("cmd /c dir /o-d /a-d c:\\*.* >d:\\allfiles.txt",SW_HIDE); //读文件d:\\allfiles.txt的内容即C:\\下所有文件按日期时间倒排序的列表

user: user-2
content: WinExec("cmd /c dir /b /a-d c:\\*.* >d:\\allfiles.txt",SW_HIDE); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字   system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。

user: user-0
content: 引用 2 楼 u010030181 的回复:仅供参考…… void FindAllFiles(const string filedir)//filedir 目录  { 	HANDLE fileFound;     WIN32_FIND_DATA fileData;      string allfiledata = filedir;     allfiledata += "\\*.*";      if(allfiledata.find(" ") != -1)     {     	allfiledata ="\"" +  allfiledata + "\"";     }      fileFound = FindFirstFile(allfiledata.c_str(), &fileData);     if (INVALID_HANDLE_VALUE == fileFound)  //没有找到文件,则返回     {     	return;     }      string fileName;     while (FindNextFile(fileFound, &fileData))  //     {     	fileName =(string)(fileData.cFileName);          if ((fileName.rfind(".txt") != string::npos)) 		{ 			//其中fileName是文件名，你既可以根据扩展名查找，也可以根据你文件名的特点查找 			//do something          }     }     FindClose(fileFound);     fileFound = NULL; }  嗯， 我没说清楚， 我主要想根据文件的属性例如， 根据最后修改的时间 来查找文件， 我看MSDN是用FindFirstFileEX（）函数， 不过我没弄清楚怎么传参数来选择指定时间的文件

user: user-0
content: 不好意思， 我没说清楚，  我想根据文件的属性来查找， 根据MSDN的描述是用 FindFirstFileEX（）这个函数， 不过我看了下 没找到实例，  也没弄清楚那几个参数应该怎么来根据文件的时间属性来查找文件。

user: user-3
content: 楼主你所需要查找的日志文件是指那一块的呢？

user: user-4
content: 仅供参考…… void FindAllFiles(const string filedir)//filedir 目录  { 	HANDLE fileFound;     WIN32_FIND_DATA fileData;      string allfiledata = filedir;     allfiledata += "\\*.*";      if(allfiledata.find(" ") != -1)     {     	allfiledata ="\"" +  allfiledata + "\"";     }      fileFound = FindFirstFile(allfiledata.c_str(), &fileData);     if (INVALID_HANDLE_VALUE == fileFound)  //没有找到文件,则返回     {     	return;     }      string fileName;     while (FindNextFile(fileFound, &fileData))  //     {     	fileName =(string)(fileData.cFileName);          if ((fileName.rfind(".txt") != string::npos)) 		{ 			//其中fileName是文件名，你既可以根据扩展名查找，也可以根据你文件名的特点查找 			//do something          }     }     FindClose(fileFound);     fileFound = NULL; }

user: user-5
content: msdn上没示例吗
user-0 提问: C编程求助 输入几句话 每输入一句话换一行 然后查有几个character 几个word 和几行

回复:
user: user-1
content: 你说的就是《c程序设计语言》14页的代码，我来抄一遍把！当时看到这段代码，心里还是波涛汹涌，崇拜的要死啊，当时正好在学习《数字逻辑》，看到了这段代码我就想到了时序电路，转台转移方程，太妙了。/*************************************************************************     > File Name: charactercount.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月11日 星期六 21时16分52秒  ************************************************************************/ #define IN 1 #define OUT 0 #include<stdio.h> int main() { 	int c,nl,nw,nc,state; 	state = OUT; 	nl = nw = nc =0; 	while((c = getchar()) !=EOF) 	{ 		++nc; 		if(c =='\n') 			++nl; 		if(c == ' ' || c == '\n' ||  c == '\t') 			state = OUT; 		else if(state == OUT) 		{ 			state = IN; 			++nw; 		} 	} 	printf("%d %d %d\n",nl,nw,nc); }

user: user-2
content: 直接定义一个字符数组来存输入的内容； 行数可以判断字符是否‘\n'来计算； 统计字符数目，看需要统计的包不包括标点符号和空格之类的，如果不包括，可以用isspace判断是否空白字符，ispunct判断是否标点符号，这两个函数是在ctype.h这个头文件的； Word数可以通过设置一个标志，初始化为false，遇到非空白字符和标点符号则变为true，并且计数加1，直到遇到一个空白字符或者标点符号再变为false。

user: user-3
content: 1、申请一个大数组char sent[512] 2、输入句子，存入sent中 3、计算句子长度，用strlen(sent) 4、遍历数组，对每一个字符判断是不是要求的字符，判断是不是空白字符和标点符号 5、句子数加1，回到2 需要定义一个结束标记，比如输入空行时结束，输出结果并退出。

user: user-4
content: 用数组就可以了
user-0 提问: debug程序

回复:
user: user-1
content: 大的红色框选部分鼠标点击可设置断点，也可以光标在某一行，然后F9快捷键，还可以从上面的调试中找 另一个红色部分是执行下一步，具体哪个，快捷键是什么，自己尝试吧

user: user-2
content: 引用 2 楼 zhao4zhong1 的回复:单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。+1.。。。。

user: user-3
content: 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-4
content: 你用vs2010编译么，用这个的话把#include<stdio.h>改成#include"stdafx.h"。 vs2010按F5运行，按F10或F11调试，按CTRL+F10运行到光标所在行。
user-0 提问: 求高手解答错误在那！程序显示的错误在14行1列，但是就是不知道错在那！

回复:
user: user-1
content: 你声明的是int year_of_birth, age_in_201；错误的是age_in_2010；多有一个0

user: user-0
content: 找到了 ，谢谢大家。我还是不够细心

user: user-2
content: int year_of_birth, age_in_201 第一个错误是缺少；，已经有人回答了。 第二步的错误是因为你定义的是age_in_201，你使用的却是age_in_2010

user: user-0
content: 还要麻烦你们下

user: user-3
content: 上面一行后面少了个";"吧~

user: user-4
content: int year_of_birth, age_in_201      这里是没有“；”啊！！！

user: user-0
content: 补充

user: user-5
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-6
content: 你应该把编译器报的错也写出来
user-0 提问: public, ?A什么意思

回复:
user: user-1
content: 从楼上内容可以看出，CSDN代码语法高亮不支持64位汇编。

user: user-1
content: #if	defined(OS_DEV_USE_TIMER1) EXTERN CODE32 (timer1_irq_c?A)	 PUBLIC TIMER1_IRQ?A	 TIMER1_IRQ?A      	PROC    CODE32 SUB	 LR, LR, #4 STMFD	SP!, {R0-R3, R12, LR} MRS	 R3, SPSR STMFD	SP!, {R3}    BL	 timer1_irq_c?A  MSR	 CPSR_c, #0X92  LDR	 R0, =os_tcb_rdy LDR	 R0, [R0] LDR	 R1, =os_tcb_cur LDR	 R1, [R1] CMPEQ	R0, R1  LDMFD	SP!, {R3} MSR	 SPSR_cxsf, R3  LDMEQFD	SP!, {R0-R3, R12, PC}^ LDR	 PC, =os_int_ctx_sw ENDP #endif

user: user-2
content: keil里面的全局函数定义
user-0 提问: 有关链接属性声明的疑问

回复:
user: user-1
content: /*************************************************************************     > File Name: extern.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月11日 星期六 21时43分24秒  ************************************************************************/ #include<stdio.h> int i=8; void foo(); int main() { 	static int i=3; 	foo(); 	return 0; } void foo() { 	extern int i; 	printf("%d\n",i); } //8 如果把int i=8;注释掉，则会报错 extern.c:(.text+0x1b): undefined reference to `i' collect2: error: ld returned 1 exit status  因为，被static修饰过的变量是没有外部链接属性的，而这里在没有别的变量 i 了，所以编译器认为 i 没有定义。更多详情，请参考《c专家编程》

user: user-0
content: 求大神们显式地解释……

user: user-2
content: 百度。。。。

user: user-0
content: 能具体说说吗？

user: user-3
content: 参考gcc源代码中相关片断。

user: user-4
content: mark,这个问题很有意思
user-0 提问: 一个简单函数中的段错误？？？

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

user: user-2
content: 段错误就是访问了不该访问的内存。t1在.rdata段，这个段是只读的，你尝试写肯定段错误了。

user: user-3
content: t1是个常量，只可访问，不能修改的

user: user-4
content: t1是常量字符串，不能修改，还有不要用time作变量类型，这个是函数
user-0 提问: 今天发现了一个奇妙的现象

回复:
user: user-1
content: 这是不可预料的代码，纠结这个没有意义。

user: user-2
content: 有奇妙吗？  挂羊头卖狗肉

user: user-3
content: 引用 1 楼 u013163178 的回复:http://bbs.csdn.net/topics/370153775我曾经也有这样的想法，知道后来看到了这个帖子 点进去仔细读读应该就明白了

user: user-4
content: 这样的代码大概可以用来参考买彩票。

user: user-5
content: gdb> disas main

user: user-6
content: C++版块一直有一个专门讲这个的置顶帖.   [置顶] C,C++表达式求值顺序 裘老的解释。  自己折腾下可以, 实际工作中不要使用这种, 自己都不知道结果是怎么的代码

user: user-7
content: 能别写这种无聊而且会出问题的代码吗

user: user-8
content: 别纠结这种问题，意义不大

user: user-9
content: 由此可以引申出下列问题 fun(++i,i++,i++,++i) fun(++i,i++,i++,++i) fun(++i,i++,i++,++i)

user: user-10
content: 写自己清楚的代码。系统允许的很多规则无法被我们理解.

user: user-11
content: http://bbs.csdn.net/topics/370153775我曾经也有这样的想法，知道后来看到了这个帖子

user: user-12
content: 一楼说的置顶帖，建议仔细看看

user: user-13
content: 没意思.......

user: user-14
content: 没意思....................

user: user-15
content: 是听那个的为什么

user: user-16
content: 尽量不写这种代码，看下置顶帖

user: user-17
content: 如果你在单位里面写出这种代码， 那么你得先做好被离职的思想准备

user: user-18
content: C\C++允许在一个表达式中使用一个以上的赋值类运算，包括赋值运算符、自增运算符、自减运算符等。这种灵活性使程序简洁，但同时也会引起副作用。这种副作用主要表现在：使程序费解，并易于发生误解或错误。        自增运算符、自减运算符连续多个使用时，由于运算顺序由编译器及当时的运行情况决定，导致运算结果不可控。所以在C程序设计中，要慎重使用自增、自减运算符，特别是在一个表达式中不要多处出现变量的自增、自减等运算。  另：http://blog.chinaunix.net/uid-20767210-id-1849728.html
user-0 提问: C程序编译和链接问题，求解，在线等，急

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

user: user-2
content: 是 [/quote]

user: user-3
content: 啥叫程序结构

user: user-4
content: 是
user-0 提问: C 语言问题

回复:
user: user-1
content: int (*call_vec[])(void) 意思是 call_vec 指向一个数组，该数组中元素为函数指针，函数返回值是int，参数是void。

user: user-2
content: 函数指针数组

user: user-3
content: 仅供参考#include <stdio.h> double A[300][100]; double valuex[300]; double valuey[300]; int i; double fun00(double x,double y) {return x  +   y  ;}; double fun01(double x,double y) {return x*x+ 3*y  ;}; double fun02(double x,double y) {return x  + 2*y*x;}; //...  fun03(double x,double y) {return ...+...   ;}; //... //...  fun98(double x,double y) {return ...+...   ;}; double fun99(double x,double y) {return x/2+20*y  ;}; double (*funNN[100])(double,double)={     fun00,     fun01,     fun02, //  fun03, //  ... //  fun98,     fun99, }; int main() {     double x,y;     int f,FN;      for (i=0;i<300;i++) {         valuex[i]=(double)i;         valuey[i]=(double)i;     }     FN=3;     for (i=0;i<300;i++) {          x=valuex[i];          y=valuey[i];          for (f=0;f<FN;f++) A[i][f]=funNN[f](x,y);     }     for (i=0;i<3;i++) {         for (f=0;f<FN;f++) printf("%lg ",A[i][f]);         printf("\n");     }     return 0; } //0 0 0 //2 4 3 //4 10 10

user: user-4
content: 把第一行分成两行就行了。  typedef int (* FunctionPointerType)(void);  FunctionPointerType call_vec[] = { ...

user: user-5
content: 函数指针数组

user: user-6
content: 这个是函数指针数组，指向=号后面大括号里的那一大堆函数名所在的地址。它确实是个变量数组，不过有点特别，内容是函数的地址。
user-0 提问: 完成C源文件编辑后、到生成执行文件，C语言处理系统必须执行的步骤

回复:
user: user-1
content: 《程序员的自我修养——链接、装载与库》

user: user-2
content: 编译这个已经包括汇编的功能。答应是D。
user-0 提问: 字母饼干

回复:
user: user-1
content: 仅供参考 #include <stdio.h>  int main() {     int len;     int input[128]={0};     char temp;     scanf("%d",&len);     for(getchar();(temp=getchar())!='\n'&&len>0;len--)     {         input[(int)temp]++;     }     for(;(temp=getchar())!='\n';)     {         if(input[(int)temp]<=0)         {             printf("no\n");             return 0;         }         input[(int)temp]--;     }     printf("yes\n");     return 0; }

user: user-2
content: #include <stdio.h> #include <string.h> int main() {     //freopen("test0.in", "r", stdin);     //freopen("test0.out", "w", stdout);     char ch1, ch2[101];     int t, a[100], flag;     while(~scanf("%d", &t))     {         flag = 1;         getchar();         memset(a, 0, sizeof(a));         while(t--)         {             ch1 = getchar();             a[ch1-'A']++;         }         getchar();         scanf("%s", ch2);         int len = strlen(ch2);         int i;         for(i = 0; i < len; i++)         {             if(a[ch2[i]-'A'])             {                 a[ch2[i]-'A']--;             }             else             {                 flag = 0;                 break;             }         }         if(flag)         {             printf("Yes\n");         }         else         {             printf("No\n");         }     }     return 0; }

user: user-3
content: 同一楼 楼主倒是把问题好歹描述一下啊！难道希望这个也是只可意会不可言传

user: user-4
content: 你问什么呢？
user-0 提问: C语言题目求教！！

回复:
user: user-1
content: 不知道

user: user-2
content: 对于大多数的编译器而言，char 表示的范围是0到127，处于无符号和有符号数的中间范围，将char赋值成一个负值，编译器就会自动将char转换为无符号数，-120而就会变成一个非常大的数，这个很大数当然很有可能是-120啦

user: user-3
content: 负值char 转换成整型，无穷大，-120当然在其中。

user: user-4
content: C 因为编译器可以设置char默认为unsigned char

user: user-5
content: 不清楚， 这是二级考试的题吗？ 我试了试gcc、c-free、dev-c++，结果都是-120 感觉这题比较坑，平时正常情况下谁会这么干

user: user-6
content: 如果让我做这题目。我也不会。

user: user-7
content: 可能跟编译器有关系吧

user: user-8
content: 不知道。。。
user-0 提问: 谁能解决这个问题，帮帮我，100分奉上

回复:
user: user-1
content: 就为了写点小程序的话， 用在线性编译器就好。

user: user-0
content: http://download.csdn.net/detail/luoye007001/5210420 —————— 从这里下了个 gcc，搞定了

user: user-2
content: 已经用安卓了就没必要再整回linux了吧，搞的不伦不类的，那还不如直接整个linux的平板，如果是技术控的话，那没话说了。如果只是想在安卓上用c++编程，可以用一下c4droid。它用G++编译程序，能在安卓上运行的。我看了下，生成的文件里有.o文件，不好意思，本人对linux并不熟悉。
user-0 提问: Vs编译.c文件   .C文件调用ffmpeg

回复:
user: user-0
content: 引用 6 楼 ZhaDeNianQu 的回复:[quote=引用 5 楼 qiminixi 的回复:] [quote=引用 4 楼 ZhaDeNianQu 的回复:] [quote=引用 2 楼 qiminixi 的回复:] VC6.0是C98的C语言编译器 我用的是vs2008，难道是还需要改什么配置环境吗？[/quote] 2008也是C98，不支持C99。 你看看ffmpeg的头文件是不是C99的，如果是这个问题的话，就用C++编译器吧（换成cpp文件），好像2012以上的VS才支持c99[/quote]  如何看ffmpeg头文件是c99还是c98呢？我用的是ffmpeg的2.4版本。。[/quote]  感谢了，我自己解决了。。。但并不是你的这个问题

user: user-0
content: 引用 5 楼 qiminixi 的回复:[quote=引用 4 楼 ZhaDeNianQu 的回复:] [quote=引用 2 楼 qiminixi 的回复:] VC6.0是C98的C语言编译器 我用的是vs2008，难道是还需要改什么配置环境吗？[/quote] 2008也是C98，不支持C99。 你看看ffmpeg的头文件是不是C99的，如果是这个问题的话，就用C++编译器吧（换成cpp文件），好像2012以上的VS才支持c99[/quote]  如何看ffmpeg头文件是c99还是c98呢？我用的是ffmpeg的2.4版本。。

user: user-1
content: 引用 4 楼 ZhaDeNianQu 的回复:[quote=引用 2 楼 qiminixi 的回复:] VC6.0是C98的C语言编译器 我用的是vs2008，难道是还需要改什么配置环境吗？[/quote] 2008也是C98，不支持C99。 你看看ffmpeg的头文件是不是C99的，如果是这个问题的话，就用C++编译器吧（换成cpp文件），好像2012以上的VS才支持c99

user: user-0
content: 引用 2 楼 qiminixi 的回复:VC6.0是C98的C语言编译器 我用的是vs2008，难道是还需要改什么配置环境吗？

user: user-2
content: 用qt的路过。。。

user: user-1
content: VC6.0是C98的C语言编译器

user: user-0
content: 主要是这个警告问题，我调用库里面的API，为什么会提示这个api未定义。。。。。。求解
user-0 提问: 文件流中的EOF标准键盘输入中的EOF

回复:
user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:参考fgetc对应的源代码、 C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\FGETC.C C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\fgetc.c

user: user-1
content: 参考fgetc对应的源代码、

user: user-2
content: 那回车本身怎么输入呢
user-0 提问: c安全编码标准中整数加法溢出的判断方法分析（补码）

回复:
user: user-1
content: 《The Intel 64 and IA-32 Architectures Software Developer's Manual》

user: user-1
content: if (     (         (si1^si2)         |         (             (                 (                     si1^(                         ~(si1^si2)                         &                         (                             1 << (sizeof(int)*CHAR_BIT-1)                         )                     )                 )                 +si2             )             ^si2         )     )     >= 0 )  //有符号整形a和b,如何判断a+b是否溢出 #pragma warning(disable:4035) #include <stdio.h> int ifo_add(int a,int b) {     __asm {         mov eax,a         add eax,b         jo  overflowed         xor eax,eax         jmp no_overflowed overflowed:         mov eax,1 no_overflowed:     } } int main() {     int a,b;      a=          1;b= 2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));     a=         -1;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));     a= 2147483647;b= 1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));     a=-2147483647;b=-1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));     a=-2147483647;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b)); } //          1+( 2) 0 //         -1+(-2) 0 // 2147483647+( 1) 1 //-2147483647+(-1) 0 //-2147483647+(-2) 1

user: user-2
content: 学习了，分析的挺好 要是好好排下版，观众应该会更多的，这么一大段看着太累了

user: user-0
content: 寂寞的顶一下！

user: user-0
content: 嗯啊，这些东西（可移植，安全）确实牺牲不少效率，得细细斟酌考量……

user: user-1
content: 引用 9 楼 zytsonny 的回复:冤枉呀，这不是我的方法，我在书里看到的，它没给解释，我看它可移植性好一些，就试着分析了一下…… 不过感谢大神的提点了！  关于可移植性： 说“跨平台一定比不跨平台好”就和说“双性恋一定比异性恋好”一样！   ←这句话不是我原创，但我很赞同。

user: user-0
content: 冤枉呀，这不是我的方法，我在书里看到的，它没给解释，我看它可移植性好一些，就试着分析了一下…… 不过感谢大神的提点了！

user: user-1
content: 楼主你知道你的方法编译生成的汇编指令条数是我的方法编译生成的汇编指令条数的多少倍吗？  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-1
content: 尺有所短，寸有所长。

user: user-0
content: 3楼提到的方法也不错哦，不过原理不太一样，你这个还是计算了两数相加，然后判断了标志位寄存器…… 我提到的那个方法，其实在溢出的情况下是没有让两数真正相加的…… 不过感谢3楼提到的方法，学习了

user: user-0
content: 引用 2 楼 user-2 的回复:学习了，分析的挺好 要是好好排下版，观众应该会更多的，这么一大段看着太累了  是的，这么一大段确实看着费劲……
user-0 提问: 为什么我还没输入折扣哪项，他就有一堆数字在

回复:
user: user-1
content: 他就有一堆数字在 楼主说的他是谁啊  是说输出的未初始化的变量吧， 一开始你不赋予变量值 那里边就是个垃圾数字所以，如你所见 scanf不要这么用——http://blog.csdn.net/u012421456/article/details/18501309

user: user-2
content: 变量的初始化

user: user-3
content: 这就是强调变量要初始化的重要性。
user-0 提问: 宏函数里能包含条件编译吗？

回复:
user: user-0
content: 只能拆成两段了。

user: user-1
content: 嗯，如果实在不行的话，只能拆成2段吧

user: user-0
content: 改成下面这样倒是可以编译过。  #if (FGVI == ON)   #define EXCHAN(a,b)    \   {                                     \      a = b;                         \   }  #endif  不过实际的程序里，宏函数里还有其他的代码，如下： #define EXCHAN(a,b)    \   {                                     \   #if (FGVI == ON)           \       if(a == b)                    \       {                                 \             error();               \       }                               \   #endif                            \       a->item1 = 1;              \       a->item2 = 2;             \   }

user: user-1
content: 改成这样试试  #if (FGVI == ON)  #define EXCHAN(a,b)    \  {                                     \     a = b;                         \  } #endif

user: user-1
content: 好像是不行啊
user-0 提问: C语言 tcp 异常断开的检测代码？

回复:
user: user-0
content: 是只能做心跳处理，服务端定时给客户发包，判断是否在线

user: user-1
content: 在服务端检测，只能是在连接里面做自定义的心跳处理了，你用别的办法，可能客户端没有公网地址，根本通不了

user: user-2
content: 引用 6 楼 hc_net 的回复:只要做一个主动式的检测就可以了，客户端不需要，我说的是类似于ping 只要知道，客户是否在线，不管是断电了还是网线断开状态 在所有待检测的主机上运行一个服务，定期给机群管理这报告自己状态。

user: user-2
content: 你是要检测某个主机是否可达还是检测某个TCP 连接是否断开？

user: user-0
content: 只要做一个主动式的检测就可以了，客户端不需要，我说的是类似于ping 只要知道，客户是否在线，不管是断电了还是网线断开状态

user: user-1
content: 为什么还要做一个ping呢？你就在连接里面自己做个心跳包处理不就行了？

user: user-0
content: 有函数可以实现吗，反正测试过用ping 是可以，但是特殊情况下是禁 ping的

user: user-3
content: 这个不行的，上面的函数是采用TCP的心跳机制进行检测的，如果需要检测指定IP的连接状态，可以自己通过心跳机制实现

user: user-1
content: 不行！心跳是tcp实现操作的，没办法控制到某个ip

user: user-4
content: 如果建立了端对端的tcp链接，当然可以判断是否断开 如果需要判断某些设备是否存活，试试组播
user-0 提问: 链表保存多项式问题

回复:
user: user-0
content: 引用 8 楼 jiuchang 的回复:你把修改后的代码和编译错误发出来看看 我真觉得你的这种方法不可靠，因为我定义的poly的数据类型的前身就是linklist，这个数据类型是*linklist，所以poly后面不可能会是指针类型的数据。至于你说的直接传送结构体类型数据，改程序没有直接传送数据，而是传送的结构体类型数据的地址，只是引函数符号不过，所以我蒋隐函数符号去掉了。。 如果定义的是poly *p,那么之后所有的poly数据类型都要定义成指针型数据，编译结果如下：

user: user-1
content: 你把修改后的代码和编译错误发出来看看

user: user-0
content: 引用 6 楼 jiuchang 的回复:过不了是什么意思？编译不过，还是执行结果错误？ 编译不过。

user: user-1
content: 过不了是什么意思？编译不过，还是执行结果错误？

user: user-2
content: 大一学的太狗血了，感觉越来越没心思来看代码了。。。

user: user-0
content: 引用 10 楼 jiuchang 的回复:需要对*p加括号，优先级问题 (*p)->data.coef = 0; 结果如下：  感觉还是初始化的问题...我换了一种方法，就是用return返回表头，这种方法是可行的。

user: user-1
content: 需要对*p加括号，优先级问题 (*p)->data.coef = 0;

user: user-3
content: int initiate(poly p) int creation(poly p) 改成： int initiate(poly &p) int creation(poly &p) 即可

user: user-1
content: 下面这个是有问题的 int initiate(poly p) { p=(poly)malloc(sizeof(lnode)); p->data.coef=0; p->data.expn=-1; p->next=NULL; return 0; }//初始化多项式  调用时 poly p; initiate(p); p是一个结构，initiate中申请的内在是无效的，p->next也没有被赋值为NULL.  我估计你的原意是 poly *p;  另外传参时需要传递指针类型的参数，如 initiate(poly *p); creation(poly *p); print(poly *p); 直接传结构会引起很多预料之外的问题

user: user-0
content: 引用 2 楼 jiuchang 的回复:下面这个是有问题的 int initiate(poly p) { p=(poly)malloc(sizeof(lnode)); p->data.coef=0; p->data.expn=-1; p->next=NULL; return 0; }//初始化多项式  调用时 poly p; initiate(p); p是一个结构，initiate中申请的内在是无效的，p->next也没有被赋值为NULL.  我估计你的原意是 poly *p;  另外传参时需要传递指针类型的参数，如 initiate(poly *p); creation(poly *p); print(poly *p); 直接传结构会引起很多预料之外的问题 刚才试了一下，这样造成的结果是程序过不了....

user: user-0
content: 引用 3 楼 gkl23 的回复:int initiate(poly p) int creation(poly p) 改成： int initiate(poly &p) int creation(poly &p) 即可 你这个加上引函数符号我试过，编译器过不了。
user-0 提问: 谁能帮我看看这程序？

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  老师根据你的方法，让我了解了程序的执行情况，使我对程序有进一步的理解。 但是程序中，我还有一点不够明白，希望老师能够继续帮我解答！！！！！  while(p!=(a+k))///这句语句是什么意思？    {     p=strrchr(a,' ');     printf("%s ",p+1);      *(p)='\0';//这里p指针为什么要加括号？和*P不一样吗？ 为什么给P赋\0，是对字符数组的结束？   }

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 谢谢老师！ 我是一名c语言的初学者，可能是我对编译器使用不够了解，学习方式比较落后。 之前我都不知道有这一功能，谢谢老师让我知道了一个重要技能。

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 4 楼 misskissC 的回复:[quote=引用 3 楼 fzx6393 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  老师根据你的方法，让我了解了程序的执行情况，使我对程序有进一步的理解。 但是程序中，我还有一点不够明白，希望老师能够继续帮我解答！！！！！  while(p!=(a+k))///这句语句是什么意思？    {     p=strrchr(a,' ');     printf("%s ",p+1);      *(p)='\0';//这里p指针为什么要加括号？和*P不一样吗？ 为什么给P赋\0，是对字符数组的结束？   }[/quote] while(p!=(a+k))表示如果p和a+k的值不等就进入循环体。p和a+k是两个地址值。 *p与*(p)结果一样。'\0'是C中一个字符串结束的标志。判断一个字符串是否结束就是用的这个标志：'\0'。[/quote] 谢谢 misskissC  zhao4zhong1 的帮助！

user: user-2
content: 引用 3 楼 fzx6393 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  老师根据你的方法，让我了解了程序的执行情况，使我对程序有进一步的理解。 但是程序中，我还有一点不够明白，希望老师能够继续帮我解答！！！！！  while(p!=(a+k))///这句语句是什么意思？    {     p=strrchr(a,' ');     printf("%s ",p+1);      *(p)='\0';//这里p指针为什么要加括号？和*P不一样吗？ 为什么给P赋\0，是对字符数组的结束？   }[/quote] while(p!=(a+k))表示如果p和a+k的值不等就进入循环体。p和a+k是两个地址值。 *p与*(p)结果一样。'\0'是C中一个字符串结束的标志。判断一个字符串是否结束就是用的这个标志：'\0'。
user-0 提问: 请教如何通过SOCKET方式获取一个ZIP文件

回复:
user: user-0
content: 那需要特意安装个WIN下的wget命令包吧？ 有简单的方式，如果通过SOCKET的方式去下一个FTP上的TXT文件那样简单的办法吗？只需要简单的编写一些代码.

user: user-1
content: 引用 5 楼 sunrier 的回复:WIN下有简单的方式实现吗？ 调用Windows下类似wget功能的命令行工具。

user: user-0
content: WIN下有简单的方式实现吗？

user: user-2
content: 从url下载文件，那不得http libcurl很方便啊。 linux下wget也很方便。

user: user-0
content: 不是，不使用库。

user: user-1
content: 使用curl库？

user: user-0
content: 因为下载下来的ZIP文件数据不是标准的，HTTP下发的最后还有一堆不需要的数据。恩，可以了，主要注意的是这样做ZIP文件必须要以二进制形式的。

user: user-3
content: 引用 9 楼 sunrier 的回复:恩，关键是下ZIP的时候获取结束标志怎么判断，ZIP文件里面有特殊字符的。 为什么要判断结束符，将接收到的内容（除了http头之外）以二进制形式(wb)写入文件即可。我刚试过了，完全可行。

user: user-0
content: 恩，关键是下ZIP的时候获取结束标志怎么判断，ZIP文件里面有特殊字符的。

user: user-3
content: 通过http下载zip文件和txt文件是一样的。下面是一个简单的win下http请求的示例，稍作修改便可使用。  #include <WinSock2.h> #include <stdio.h>  #pragma comment(lib,"ws2_32.lib")  int main() { 	//构造socket 	WSADATA data; 	SOCKET sock; 	if (WSAStartup(MAKEWORD(2, 2), &data) != 0) return -1; 	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 	if (sock == INVALID_SOCKET) 	{ 		printf("invalid socket !"); 		return -1; 	} 	 	//连接服务器 	SOCKADDR_IN addr; 	addr.sin_family = AF_INET; 	addr.sin_port = htons(80); 	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 	if (connect(sock, (SOCKADDR *)&addr, sizeof(addr)) == SOCKET_ERROR) 	{ 		printf("connect error !"); 		closesocket(sock); 		return -1; 	}  	//发送HTTP请求 	char buf[1024]; 	int count = sprintf(buf, "GET /main.c HTTP/1.1\r\nhost:%s\r\n\r\n", "127.0.0.1"); 	send(sock, buf, count, 0);  	//接收回复并打印 	count = recv(sock, buf, 1024, 0); 	if (count > 0) 	{ 		buf[count] = 0; 		printf(buf); 	}  	closesocket(sock); 	WSACleanup(); 	return 0; }
user-0 提问: 新手简单c题目求解答！

回复:
user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:仅供参考//输入一个小于200的字符串，将该字符串以“_”分割成小于20的字串。请输出原串和子串。 //请注意以下测试用例： //·输入空串 //·输入长度为9的字符串 //·输入长度为19的字符串 //·输入长度为20的字符串 //·输入长度为38的字符串 //·输入长度为205的字符串 //·理论上还应该考虑输入串中包含_如何处理的逻辑（这个在我的代码中没有体现） #include <stdio.h> #include <string.h> char s[201]; char d[11][21]; int i,L,n; void main() {     fgets(s,201,stdin);     L=strlen(s);     if ('\n'==s[L-1]) {s[L-1]=0;L--;}     for (i=0;i<L;i++) {         d[i/19][i%19]=s[i];         if (i!=L-1 && 18==(i%19)) {             d[i/19][19]='_';             d[i/19][20]=0;         }     }     d[i/19][i%19]=0;     if (i>0 && 0==(i%19)) {         n=i/19;     } else {         n=i/19+1;     }     printf("s=\"%s\"\n",s);     for (i=0;i<n;i++) {         printf("d[%2d]=\"%s\"\n",i,d[i]);     } } 程序好像有点超出我的理解能力了，不过谢谢了，留下来研究研究

user: user-1
content: 仅供参考//输入一个小于200的字符串，将该字符串以“_”分割成小于20的字串。请输出原串和子串。 //请注意以下测试用例： //·输入空串 //·输入长度为9的字符串 //·输入长度为19的字符串 //·输入长度为20的字符串 //·输入长度为38的字符串 //·输入长度为205的字符串 //·理论上还应该考虑输入串中包含_如何处理的逻辑（这个在我的代码中没有体现） #include <stdio.h> #include <string.h> char s[201]; char d[11][21]; int i,L,n; void main() {     fgets(s,201,stdin);     L=strlen(s);     if ('\n'==s[L-1]) {s[L-1]=0;L--;}     for (i=0;i<L;i++) {         d[i/19][i%19]=s[i];         if (i!=L-1 && 18==(i%19)) {             d[i/19][19]='_';             d[i/19][20]=0;         }     }     d[i/19][i%19]=0;     if (i>0 && 0==(i%19)) {         n=i/19;     } else {         n=i/19+1;     }     printf("s=\"%s\"\n",s);     for (i=0;i<n;i++) {         printf("d[%2d]=\"%s\"\n",i,d[i]);     } }

user: user-0
content: 引用 2 楼 u012421456 的回复:说实话，并不太明白你说的题意  [quote=引用 楼主 WJ_Local 的回复:] 把较长的输入行“折”成短一些的两行或多行，折行位置在输出行的第n列之前的最后一个空格符之后。 要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。[/quote] 题目要求： 输入“i am a student welcome to c world" 打印"i am a \nstudent  \nwelcome \nto c world\n" 程序实际运行： 输入"i am a stuent" 打印" a stuent"

user: user-0
content: 引用 2 楼 u012421456 的回复:说实话，并不太明白你说的题意  [quote=引用 楼主 WJ_Local 的回复:] 把较长的输入行“折”成短一些的两行或多行，折行位置在输出行的第n列之前的最后一个空格符之后。 要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。[/quote]就是我输入"i am a student"程序就打印 "i am a   student"

user: user-0
content: 引用 1 楼 u012421456 的回复:16行到29行的while循环，如果c不为\t、\n且else if(++pos>=N)不成立，你看会怎样不成立的话就在循环一次

user: user-2
content: 说实话，并不太明白你说的题意  引用 楼主 WJ_Local 的回复:把较长的输入行“折”成短一些的两行或多行，折行位置在输出行的第n列之前的最后一个空格符之后。 要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。

user: user-2
content: 16行到29行的while循环，如果c不为\t、\n且else if(++pos>=N)不成立，你看会怎样
user-0 提问: C语言中的一个问题

回复:
user: user-1
content: U代表无符号整型

user: user-2
content: C Integer Constants An “integer constant” is a decimal (base 10), octal (base 8), or hexadecimal (base 16) number that represents an integral value. Use integer constants to represent integer values that cannot be changed.  Syntax  integer-constant :  decimal-constant integer-suffix opt octal-constant integer-suffix opt hexadecimal-constant integer-suffix opt  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffix opt long-suffix unsigned-suffix opt   unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  Integer constants are positive unless they are preceded by a minus sign (–). The minus sign is interpreted as the unary arithmetic negation operator. (See Unary Arithmetic Operators in Chapter 4 for information about this operator.)  If an integer constant begins with the letters 0x or 0X, it is hexadecimal. If it begins with the digit 0, it is octal. Otherwise, it is assumed to be decimal.   The following lines are equivalent:  0x1C   /* = Hexadecimal representation for decimal 28 */ 034    /* = Octal representation for decimal 28 */  No white-space characters can separate the digits of an integer constant. These examples show valid decimal, octal, and hexadecimal constants.   /* Decimal Constants */ 10 132 32179  /* Octal Constants */ 012 0204 076663  /* Hexadecimal Constants */ 0xa or 0xA 0x84 0x7dB3 or 0X7DB3

user: user-3
content: C语言中的浮点数有正负之分。

user: user-3
content: U表示该常数用无符号整型方式存储，相当于unsigned int; L表示该常数用长整型方式存储，相当于long F表示该常数用浮点方式存储，相当于float

user: user-0
content: 引用 楼主 palm_m 的回复:C语言中 出现"2U" 是什么意思呢？ 类似的用法还有那些，2U是不是无符号整形呢？ 如果我这么写，该如何理解 int interger=2U;  另外问一下，C语言中的浮点数有没有正负之分呢？

user: user-4
content: printf("%2u",2); 输出  2 printf("%u",2); 输出 2 前者占2隔，后者占一隔，更详细的你百度pritf吧
user-0 提问: 程序运行正确，但是自己笔下算就不正确，求解答

回复:
user: user-0
content: 哦哦，受教了，谢谢

user: user-1
content: 你怎么能够只算一次呢？  你要一直算到下面这个不成立才能够退出，否则一直在里面除下去。 while(m!=0)  你说的算到n=20时，m就是10了。while(m!=0)这个继续成立，所以又进入里面了。
user-0 提问: C语言

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

user: user-0
content: 一语见地啊，谢了哈，

user: user-2
content: 为什么不编个程序试一试呢#include<stdio.h> int main() { printf("",10); return 0; }

user: user-1
content: 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout！ 使用scanf、printf。  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-0
content: 谢谢大家对我的帮助哈

user: user-3
content: %d作为占位符，用变量的实际值来在该位置显示 如果省略了，那变量该在什么位置显示呢

user: user-4
content: 当然不能省略了，你要实现这样的输出，就得按别人的要求来。除非你自己搞一个新东西。

user: user-5
content: 可以用宏替换， 或者自己写编译器。

user: user-6
content: 不用时自然省得，要用时省了如何用得？

user: user-7
content: 当然不能省略