Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: Scanf函数非法输入的处理 

回复:
user: user-1
content: 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-2
content: 引用 5楼wang0635 的回复:代码哪里无效了？ 没问题啊你输入错误的格式，可以提示继续输入？输出结果贴上来看看？

user: user-3
content: 代码哪里无效了？ 没问题啊

user: user-2
content: 楼主的那个循环是个死循环，fflush的作用只是清空输入流，但是后面的读取一直可以是0。你可以做一个实验试一下。 另外，上面我那段代码还有个缺陷，输入1,3e时也会认为是正确结果。 考虑到fflush是微软自己引进的一个函数，它的机能不是很明确改进为（这种机制可以识别1,3e的错误）：   1 #include<stdio.h>   2 int main()   3 //计算过程中保证只有1,3形式输入才计算，1 3和1,e等   4 //认为是错误输入。直到正确输入才开始计算。   5 {   6 int i,j,a,b,c; /*计算a+b*/   7 int input;   8 char t;   9 for(i=0;;i++)  10 {  11 j=0;  12 input=scanf("%d,%d",&a,&b);  13 while((t=getchar())!='\n'&& t!=EOF) j++;  14 if(input==2 && j==0) break;  15 }  16 c=a+b;  17 printf("%d+%d=%d\n",a,b,c);  18 return 0;  19 } 这种形式scanf("%d,%d")的正确输入格式是var1,var2；如果需要var[空格]var形式，对应改为scanf("%d%d")即可。

user: user-4
content: 楼主的意思是第二段代码输入非法数据的时候程序不提示重新输入?

user: user-2
content: 1 #include<stdio.h>   2 int main()   3 {   4 int i,a,b,c; /*计算a+b*/   5 int input;   6 char t;   7 for(i=0;;i++)   8 {   9 input=scanf("%d,%d",&a,&b);  10 fflush(stdin);  11 if(input==2) break;  12 scanf("%c",&t);  13 }  14 c=a+b;  15 printf("%d+%d=%d",a,b,c);  16 return 0;  17 }  gcc编译通过，前提是输入方式是1,3，1 3认为是不合格的输入。

user: user-5
content: 输入的数据，和格式符号个数相等，表示成功， 函数返回值 就是成功输入的个数 返回值不等于格式要求输入的数据个数以及 0，EOF等表示输入失败 返回正数 表示至少有一个输入成功， 返回值和要求输入的个数相同，表示输入成功 输入失败，包括不完全成功，最好清掉输入缓存
user-0 提问: gcc编译静态函数库的问题： 库调用出错

回复:
user: user-0
content: 引用 5 楼 user-1 的回复:头文件不就是干这事的么, 不干这个要头文件干嘛. 函数声明写在头文件, 函数实现写在源文件.或者提供静态/动态库 感谢，给分～

user: user-1
content: 头文件不就是干这事的么, 不干这个要头文件干嘛. 函数声明写在头文件, 函数实现写在源文件.或者提供静态/动态库

user: user-0
content: 引用 2 楼 user-1 的回复:因为t.c里面没有主动声明triarea函数， C语言对于没有声明的函数会假定返回int之类的. c++就相对好点, 直接报错. 你好，请问最后一个问题： 我从网上查到，nm可以查看库函数内包含的函数，但是貌似不能看函数原型。 请问如果从网上下载的库函数，如果不知道它内部包含的函数原型，该怎么用？ 另外，如果在生成库函数时，调用了某些头文件，那么头文件是不是也要提供？ 谢谢～～～

user: user-0
content: 感谢大神！原来还会有这么一说。。。那岂不是说，在linux下，库在被调用的时候需要知道库里面包含的函数原型了？

user: user-1
content: 因为t.c里面没有主动声明triarea函数， C语言对于没有声明的函数会假定返回int之类的. c++就相对好点, 直接报错.

user: user-0
content: 没有人回答么？ 怎么没有人回答啊。
user-0 提问: 谁能帮我分析一下这个题目具体思路[C语言]

回复:
user: user-1
content: 仅供参考：#include <iostream> #include <string> #include <regex> using namespace std; int main() {     string str("This expression could match from A and beyond. [ expression  express ]");     string rs = "exp\\w*";  // 正则字符串，exp开始的单词     cout << str << endl;      regex expression(rs); // 字符串传递给构造函数，建立正则表达式  // regex_match 判断一个正则表达式(参数 e)是否匹配整个字符序列 str. 它主要用于验证文本。 // 注意，这个正则表达式必须匹配被分析串的全部，否则函数返回 false. // 如果整个序列被成功匹配，regex_match 返回 True.     bool ret = regex_match(str, expression);     if (ret)         cout << "可以匹配整个文本" << endl;     else         cout << "不能匹配整个文本" << endl;  // regex_search 类似于 regex_match, 但它不要求整个字符序列完全匹配。 // 你可以用 regex_search 来查找输入中的一个子序列，该子序列匹配正则表达式 e.     ret = regex_search(str, expression);     if (ret)         cout << "能够搜索到 " << rs << endl;     else         cout << "不能搜索" << endl;  // regex_replace 在整个字符序列中查找正则表达式e的所有匹配。 // 这个算法每次成功匹配后，就根据参数fmt对匹配字符串进行格式化。 // 缺省情况下，不匹配的文本不会被修改，即文本会被输出但没有改变。      str = regex_replace(str, expression, string("表达式")); // VC2010或者TR1注意：这里第三个参数要用string()转换 // http://www.johndcook.com/cpp_regex.html // started with C++ TR1 regular expressions     cout << str << endl;     return 0; } //This expression could match from A and beyond. [ expression  express ] //不能匹配整个文本 //能够搜索到 exp\w* //This 表达式 could match from A and beyond. [ 表达式  表达式 ]

user: user-1
content: 字符串：121DSFDSFBEG:U=12.34,I=0.03,T=28.5:ENDWERWFEFS 正则表达式：.*:U=([0-9.]*?),I=([0-9.]*?),T=([0-9.]*?): 检索结果：(1).12.34 (2).0.03 (3).28.5

user: user-2
content: 用正则表达式吧
user-0 提问: CRC16问题

回复:
user: user-1
content: 记得crc初始值用0而不是0xffff

user: user-1
content: 你那个是逆序的算法啊，你要对比的crc16用的什么顺序都不明确，只能瞎猜了。而且crc16还有一个ccitt版本，使用的多项式不同。下面是我从linux内核中提取出来的crc16算法： unsigned short const crc16_table[256] = { 	0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 	0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 	0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 	0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 	0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 	0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 	0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 	0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 	0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 	0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 	0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 	0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 	0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 	0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 	0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 	0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 	0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 	0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 	0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 	0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 	0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 	0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 	0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 	0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 	0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 	0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 	0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 	0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 	0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 	0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 	0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 	0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 }; static inline unsigned short crc16_byte(unsigned short crc, const unsigned char data) { 	return (crc >> 8) ^ crc16_table[(crc ^ data) & 0xff]; } unsigned short crc16(unsigned short crc, unsigned char const *buffer, unsigned int len) { 	while (len--) 		crc = crc16_byte(crc, *buffer++); 	return crc; }
user-0 提问: 字符处理

回复:
user: user-1
content: sscanf(buf, "%x", &v); 或v = strtol(buf, NULL, 16)

user: user-2
content: 引用 2 楼 andylauxing 的回复:[quote=引用 1 楼 user-2 的回复:] 自己可以想想, 想到了话, 编程能力就能提高一节了.  字符我倒可以拆成2个一组的0F 04 03 EB 00 02,但就是不知道如何把字符0F变成0x0F,也就是字符0F转成16进制形式0x0F[/quote] '0' - '0' = 0, 'F' - 'A' + 10 = 15, 0 * 16 + 15 = 15 = 0x0F 当然还要考虑小写, 甚至无效字符的就稍微麻烦了.

user: user-0
content: 引用 1 楼 user-2 的回复:自己可以想想, 想到了话, 编程能力就能提高一节了.  字符我倒可以拆成2个一组的0F 04 03 EB 00 02,但就是不知道如何把字符0F变成0x0F,也就是字符0F转成16进制形式0x0F

user: user-2
content: 自己可以想想, 想到了话, 编程能力就能提高一节了.
user-0 提问: 用指针操作三维数组的问题

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:一眼看到两个j++ 惭愧惭愧了

user: user-1
content: 第三个循环应该是想表示k++吧

user: user-2
content: 引用 1 楼 user-3 的回复:一眼看到两个j++  哈哈 ，眼尖！ for (i = 0;i < 3;i++) for (j = 0;j < 5;j++) for (k = 0;k < 7;j++)

user: user-3
content: 一眼看到两个j++
user-0 提问: C语言新手，望大神赐教 [Error] declaration of 'int k' shadow a parameter

回复:
user: user-0
content: 引用 2 楼 user-2的回复:不能在函数体的最外层定义和函数参数同名的变量。  int f (int k) {     int k, ... }  你在这里直接定义了一个和函数参数同名的变量 k 您好，我还不是特别明白，如果定义了同名变量会如何呢，不可以定义同名变量的原理是什么呢？

user: user-0
content: 谢谢 ！！！

user: user-1
content: 因为你函数参数已经用了k了，然后你里面又定义了一个

user: user-2
content: 不能在函数体的最外层定义和函数参数同名的变量。  int f (int k) {     int k, ... }  你在这里直接定义了一个和函数参数同名的变量 k

user: user-0
content: 第三行中，显示[Error] declaration of 'int k' shadows a parameter 这是为什么呢？
user-0 提问: 关于逻辑运算符的简单问题

回复:
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-2
content: -5非零为真..

user: user-3
content: -5算真，非0均为真

user: user-4
content: 否，0 =false ,else =true

user: user-5
content: 非零都算真的，我是新手，以前也搞错过， 作为新手难免有这种情况，见多了，也就慢慢进步了

user: user-0
content: 引用 2楼paschen 的回复:-5算真，非0均为真谢谢

user: user-0
content: 引用 3楼github_27756899 的回复:-5非零为真..谢谢

user: user-0
content: 引用 1楼lm_whales 的回复:否，0 =false ,else =true谢谢各位
user-0 提问: c语言希尔排序的问题！上交到校题库，冒泡排序未超时，希尔超时了。求大神指教

回复:
user: user-1
content: 参看：http://blog.sina.com.cn/s/blog_673ccb5b0100ifyv.html  数据较多时希尔排序肯定比冒泡排序好很好，从复杂度也可以看出
user-0 提问: 求帮忙！！！

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: scanf("%d",&a);

user: user-3
content: {scanf("%d",a);  我看到这里就没有看下去了  a 这边要 a的地址 --> &a  后面你继续调吧

user: user-4
content: 那么明显的错误，地址

user: user-5
content: 这是在你的程序的基础上修改得来的 #include <stdio.h> #define max 100 int main(void) { 	char c; 	int j=0,i=0; 	char a[max]; 	while((c=getchar())!='#'&&(i<max)) 	{ 		if(c=='.'||c=='!') 		{ 			if(c=='.') 				a[i++]='!'; 			if(c=='!') 			{ 				a[i++]='!'; 				a[i++]='!'; 			} 			j++; 		} 		else a[i++]=c; 	} 	a[i]='\0'; 	 		printf("%d\n%s\n",j,a); 	return 0;  }

user: user-6
content: a的类型是不是应该改为char类型，相应的scanf函数中%d改为%c。那样输入不是方便些，你难道想直接输入对应的ASCⅡ码？
user-0 提问: 字符串和字符数组的区别

回复:
user: user-0
content: 谢谢大家，我明白了

user: user-1
content: 字符串常量的值是不能修改的。

user: user-2
content: 回楼主"china" 字符串常量是不能修改的   另外 引用 2 楼 user-4 的回复:C 语言中凡是双引号引起来的字符串直接赋值给指针或作为参数，编译器将其视为： const char *p ="china" ，这个通不过;char *p ='c'，这个就可以。 C语言的 "china" 没有const的  所以 char* p = "china" 没什么问题  倒是你后面是char *p ='c' 你是怎么想的 p是char* 'c'是int 可以????

user: user-3
content: char *p = "china" 中的字符串是分配在了常量区，然后让指针指向他，你修改他的值就出错了 而字符数组则是你在栈上分配的，所以可以修改

user: user-3
content: 具体参看：http://blog.csdn.net/yahohi/article/details/7427724

user: user-4
content: C 语言中凡是双引号引起来的字符串直接赋值给指针或作为参数，编译器将其视为： const char *p ="china" ，这个通不过;char *p ='c'，这个就可以。

user: user-4
content: char *p ; p= "china"
user-0 提问: 关于字符串的问题

回复:
user: user-0
content: 多谢各位的解答

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

user: user-2
content: Hello\0

user: user-3
content: 不错，学习了

user: user-4
content: char *str1 ="Hello"; 让声明一个char*指针，指向常量区的常量字符数组，所以你不能去修改 而char[]则在在栈上分配的字符数组，可以修改  请参看：http://blog.csdn.net/yahohi/article/details/7427724

user: user-5
content: code1   :  使用的是字符指针，但你没有申请空间，仅指向常量区，而常量区不可写。

user: user-6
content: code1，使用的是字符指针，str1和str2指向数据段的某个位置，期内容时"Hello\0"和"China\0"，'\0'，表示字符串的结尾。 str1指向的位置，也就是5个字符的大小，而要将str2追加上，str1指向的内存没有足够的空间容纳str2，所以在strcat中报错。  code2，使用的是，字符数组，因为字符数组比较短，所以存放在程序运行时的堆栈中，堆栈由于对齐的关系，往往会分配多余空间，所以还能容纳str2的，故不会报错。
user-0 提问: 链表实现多项式相乘，两个多项式分别有M项和N项，求时间复杂度为O（M的平方乘以N）。

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:我还真没本事解这个惑。  既然是已出版书籍中的练习题，多半在百度上可以搜到练习题的正宗答案的。Thank you all the same.

user: user-1
content: 我还真没本事解这个惑。  既然是已出版书籍中的练习题，多半在百度上可以搜到练习题的正宗答案的。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:引用 2 楼 leonardohq 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] http://blog.csdn.net/lanseshenhua/article/details/5451798这个解法的时间复杂度为O（M²N²），我想要的是O（M²N）的解法。 个人意见：平均每天使用次数少于10次，每次使用时间不超过一分钟的算法都不需要考虑什么劳什子复杂度。[/quote]您说的很对，我并不是要拘泥于时间复杂度，这是《数据结构与算法分析》一书中的一道练习题，要求给出O（M²N²），O（M²N），O（MN）三种时间复杂度的算法，我想不出O（M²N）的解法，所以特来请教以解惑。

user: user-1
content: 引用 2 楼 leonardohq 的回复:引用 1 楼 zhao4zhong1 的回复:http://blog.csdn.net/lanseshenhua/article/details/5451798这个解法的时间复杂度为O（M²N²），我想要的是O（M²N）的解法。 个人意见：平均每天使用次数少于10次，每次使用时间不超过一分钟的算法都不需要考虑什么劳什子复杂度。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:http://blog.csdn.net/lanseshenhua/article/details/5451798这个解法的时间复杂度为O（M²N²），我想要的是O（M²N）的解法。

user: user-1
content: http://blog.csdn.net/lanseshenhua/article/details/5451798
user-0 提问: C语言指针数组维度问题！

回复:
user: user-1
content: 引用 8 楼 libinden71 的回复:[quote=引用 7 楼 paschen 的回复:] [quote=引用 6 楼 libinden71 的回复:] [quote=引用 5 楼 paschen 的回复:] 因为一级数组会退化成指针，所以总共是一个二级指针，函数参数中的数组均会退化为指针，所以你的int *gars[]在这里就和int** gars等价   我对数组的退化不是很了解，能解释下给我听吗？ 谢谢啊！[/quote]   退货后他就只是一个指针，指向数组首元素，退化前用sizeof运算符是可以得到数组的长度，退化成指针后得到的将是指针的长度（32位下为4）  具体可以参看《C++必知必会》条款6  这个我知道！我不懂的是 为什么是一个二级的指针！,int *gars[]  不是一个一级指针吗？ [/quote]  int[]退化成int* int*[]退化成int**

user: user-0
content: 明白了 ！感谢大神！

user: user-0
content: 引用 7 楼 paschen 的回复:[quote=引用 6 楼 libinden71 的回复:] [quote=引用 5 楼 paschen 的回复:] 因为一级数组会退化成指针，所以总共是一个二级指针，函数参数中的数组均会退化为指针，所以你的int *gars[]在这里就和int** gars等价   我对数组的退化不是很了解，能解释下给我听吗？ 谢谢啊！[/quote]   退货后他就只是一个指针，指向数组首元素，退化前用sizeof运算符是可以得到数组的长度，退化成指针后得到的将是指针的长度（32位下为4）  具体可以参看《C++必知必会》条款6  这个我知道！我不懂的是 为什么是一个二级的指针！,int *gars[]  不是一个一级指针吗？

user: user-1
content: 引用 6 楼 libinden71 的回复:[quote=引用 5 楼 paschen 的回复:] 因为一级数组会退化成指针，所以总共是一个二级指针，函数参数中的数组均会退化为指针，所以你的int *gars[]在这里就和int** gars等价   我对数组的退化不是很了解，能解释下给我听吗？ 谢谢啊！[/quote]   退货后他就只是一个指针，指向数组首元素，退化前用sizeof运算符是可以得到数组的长度，退化成指针后得到的将是指针的长度（32位下为4）  具体可以参看《C++必知必会》条款6

user: user-0
content: 引用 5 楼 paschen 的回复:因为一级数组会退化成指针，所以总共是一个二级指针，函数参数中的数组均会退化为指针，所以你的int *gars[]在这里就和int** gars等价   我对数组的退化不是很了解，能解释下给我听吗？ 谢谢啊！

user: user-1
content: 因为一级数组会退化成指针，所以总共是一个二级指针，函数参数中的数组均会退化为指针，所以你的int *gars[]在这里就和int** gars等价

user: user-2
content: 任何传进函数的指针，数组（实参）参数，都是指针（形参），即变量的地址 其实它就是char **argv。

user: user-3
content: gars 是指针数组，不是二维数组 数组中每个元素都是指向 char 型的指针，或者说指向字符串的指针 在windows中，你的程序，如果可执行文件名字是 asd.exe 在命令窗口中输入 asd 12 + 34 gars[0] 指向 "asd.exe" gars[1] 指向 "12" gars[2] 指向 "+" gars[3] 指向 "34" 它们都是 char* 型的 指针都可以后加[ ]，如 p[1] 就是 *(p+1)，p[0] 就是 *p，gars[2][0]就是 *(gars[2])

user: user-4
content: 应该是 int main(int argc, char * argv[])  吧？ 或者 int main(int argc, char ** argv)    int main(int argc, char *argv[]) {          printf("arg = %s, %s \n", argv[1], argv[2]);      return 0; } test@/samba/test$ ./a.out  Hello World  arg = Hello,World

user: user-0
content: 大晚上 脑子太累 printf("程序错误，被除数不能为0！\n"); 这条写错了，别在意！
user-0 提问: C语言数组如何赋值给字符串

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

user: user-2
content: char类型范围在[-128,127)，所以没办法

user: user-3
content: #include <stdio.h>  int main() { 	int str[5] = {1,2,3,4,5};       char str1[6]; 	int i = 0; 	for(i=0;i<5;i++) 	{ 		str1[i] = str[i] + '0'; 	} 	str1[i] = '\0';  	printf("%s\n",str1);  	return 0; }

user: user-4
content: int main(int argc, char *argv[]) {     char *str = "12345";     printf("str = %s \n", str); } str = 12345   int main(int argc, char *argv[]) {     char str[] = "12345";     printf("str = %s \n", str); } str = 12345

user: user-5
content: 你的str1是一个字符，不是字符串，我可以理解为是单字节整数，你倒底是要一个整数，还是要一个字符串，请先表述清楚。
user-0 提问: ascii编码表是否在链接的时候也链接到执行程序中了？

回复:
user: user-0
content: 引用 3 楼 fiveyes 的回复:操作系统中有字体库，每一个字母或汉字，即使像I这么简单的一个大写字母，它的字形也不是一个字节能够保存的。  因此ascii码表中保存的只是一个编号，操作系统首先要根据这个编号找到对应的字符，然后再从字体库中取出真正的字形，把它输出到显示器或其它设备。 所以说操作系统中有一个基础信息表，操作系统根据ASCII表找到相应的字符形状后，将其输出；

user: user-1
content: 你在电脑上用的任何资源：图片、声音、字符等等在内存里都是二进制数据，至于他表示什么，要看你怎么去解释这些数据

user: user-2
content: 操作系统中有字体库，每一个字母或汉字，即使像I这么简单的一个大写字母，它的字形也不是一个字节能够保存的。  因此ascii码表中保存的只是一个编号，操作系统首先要根据这个编号找到对应的字符，然后再从字体库中取出真正的字形，把它输出到显示器或其它设备。

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

user: user-4
content: 不是。  把 0x41 显示为 'A' 是由 OS 或者 shell 等其他程序完成的。
user-0 提问: 字符串传给this对象指针，在怎么获取到？

回复:
user: user-0
content: 引用 楼主 chinabhlt 的回复:#include <iostream> #include <cstdio> #include <cstdlib> using namespace std;  class Test { public:     Test(); 	Test(string val);     virtual ~Test();     operator string() const; 	string GetString(); }; Test::Test(){} Test::Test(string val){*this = val;} Test::~Test(){} string Test::GetString() { 	return static_cast<string>(*this); } Test::operator string() const { 	return (string)(*this); } int main(int argc, char *argv[]) { 	string haha = "haha";     Test t(haha); 	string tt = ""; 	tt = t.GetString(); 	cout << tt << endl;     return 0; }  这段程序总是报段错误，求正确的获取字符串方式？  忽略了一个细节： =运算符重载 正确的的写法： #include <iostream> #include <cstdio> #include <cstdlib> using namespace std;  class Test { public:     Test(); 	Test(string val);     virtual ~Test(); 	string GetString(); 	Test& operator=(string val); 	string m_val; }; Test::Test(){} Test::Test(string val){*this = val;} Test::~Test(){} Test& Test::operator=(string val) { 	m_val = val; } string Test::GetString() { 	return m_val; }  int main(int argc, char *argv[]) { 	string haha("haha");     Test t(haha);  	cout << t.GetString() << endl; 	     return 0; }

user: user-1
content: Test::Test(string val){*this = val;}  *this = val 需要先把 val 转换为 Test 类型，于是会递归调用 Test::Test(string) 。这是一个无穷递归。  你的 operator string 也是一个无穷递归。

user: user-2
content: 先学走，再学跑，this指针还不适合你...  private:      string m_str;  Test::Test(string val){m_str = val;}  string Test::GetString() { return m_str; }  以上.  P.S 没有用引用，指针，主旨在于简单易懂，请不要纠结于这些细节
user-0 提问: 网卡如何保证多线程收发无误？

回复:
user: user-1
content: 《WIndows核心编程》

user: user-0
content: 引用 3 楼 sand6174 的回复:单线程的，没有多线程的！你可以这样理解，网卡收到数据后会产生一个中断，存在系统内核buf中，然后根据TCP/IP以太网头等，注入某个线程中。你看到并行是假的。  你说的是接收数据的情况。那么，发送数据的情况呢？A线程也要发送数据，B线程也要发送数据。两个线程同时向网卡写入数据。那么网卡如何保证两个线程的数据相互独立？ 假设没有相应的处理机制的话，A写入网卡部分数据，CPU被B抢了，B又写了部分数据，然后A又来了，然后B又来了。这样子，数据会不会错乱？

user: user-0
content: 引用 3 楼 sand6174 的回复:单线程的，没有多线程的！你可以这样理解，网卡收到数据后会产生一个中断，存在系统内核buf中，然后根据TCP/IP以太网头等，注入某个线程中。你看到并行是假的。  你说的是接收数据的情况。那么，发送数据的情况呢？A线程也要发送数据，B线程也要发送数据。两个线程同时向网卡写入数据。那么网卡如何保证两个线程的数据相互独立？ 假设没有相应的处理机制的话，A写入网卡部分数据，CPU被B抢了，B又写了部分数据，然后A又来了，然后B又来了。这样子，数据会不会错乱？

user: user-0
content: 引用 3 楼 sand6174 的回复:单线程的，没有多线程的！你可以这样理解，网卡收到数据后会产生一个中断，存在系统内核buf中，然后根据TCP/IP以太网头等，注入某个线程中。你看到并行是假的。  你说的是接收数据的情况。那么，发送数据的情况呢？A线程也要发送数据，B线程也要发送数据。两个线程同时向网卡写入数据。那么网卡如何保证两个线程的数据相互独立？ 假设没有相应的处理机制的话，A写入网卡部分数据，CPU被B抢了，B又写了部分数据，然后A又来了，然后B又来了。这样子，数据会不会错乱？

user: user-2
content: 封包解包有标识，进程线程有标识。 到了进程线程这个层面就是操作系统的事了。你自己看操作系统方面的书。

user: user-3
content: 单线程的，没有多线程的！你可以这样理解，网卡收到数据后会产生一个中断，存在系统内核buf中，然后根据TCP/IP以太网头等，注入某个线程中。你看到并行是假的。

user: user-4
content: 网卡的处理永远是单线程的，你的程序是多线程的，所以网卡的数据是不会错乱的。而程序肯定是单个连接一个线程，不可能一个连接分出两个线程，除非你自找麻烦。根据连接，数据永远不会跑其他线程去。
user-0 提问: 这个运行结果总是不对，函数这块实在不会。求大神。

回复:
user: user-1
content: 下断点，然后单步调试。调试是解决问题的一种好方式

user: user-2
content: printf("%f\n",s(x,n));

user: user-3
content: #include<stdio.h> #include<math.h> double s(double x, double n); int main() {   	int x,n; 	scanf("%d,%d",&x,&n); 	printf("%f",s(x,n)); 	return 0; }  double s(double x, double n) {    	int i;  float sum=0.0; 	for(i=1;i<=n;i++) 		sum = sum + pow(x,i); 	return sum; }  楼主，我简单改了下，输出正常了，pow函数的第二个入参要double型，另外打印输出不能是整形。

user: user-4
content: 编译器不会警告吗, 还是说无视了.  1. 换个编译器 2. 查看警告信息
user-0 提问: C语言switch语句不执行

回复:
user: user-1
content: 引用 7 楼 qq_32202481 的回复:[quote=引用 6 楼 qq_28409599 的回复:] 很典型的错误，do3里面的getchar把空格吸收了，换成scanf("  %c",&c);注意%c前面有一个空格,吸收你输入数字后打的回车，也就是\n  如何解决[/quote] int menu()  {      int  cn;     printf("请输入指令:");     scanf("%d",&cn);     getchar();   //把空格吸收了     return cn; }

user: user-0
content: 引用 6 楼 qq_28409599 的回复:很典型的错误，do3里面的getchar把空格吸收了，换成scanf("  %c",&c);注意%c前面有一个空格,吸收你输入数字后打的回车，也就是\n  如何解决

user: user-2
content: 很典型的错误，do3里面的getchar把空格吸收了，换成scanf("  %c",&c);注意%c前面有一个空格,吸收你输入数字后打的回车，也就是\n

user: user-3
content: do2函数里面,这句a%4==0&&a%100!=0||a%100==0应该是判断闰年, 最后应该是|| a % 400 == 0

user: user-4
content: 参看：http://jingyan.baidu.com/article/fea4511a715f3bf7bb9125d7.html

user: user-5
content: 因为你在前面menu()函数里面输入3的时候，在缓存里会留下一个回车符'\n'，到do3()的时候，c=getchar()读入的是回车符

user: user-0
content: 兄弟 我的锅 是do3 不执行

user: user-6
content: #include<stdio.h> void do1() { 	int n,i,m; 	int a[10]={0}; 	printf("请输入要判断的数:"); 	scanf("%d",&n); 	m=n; 	for(i=0;;i++) 	{ 		a[i]=m%10; 		m/=10; 		if(m==0) 			break; 	} 	for(i=0;a[i]!=0;i++) 	{ 		m+=a[i]*a[i]*a[i]; 	} 	if(n==m) 		printf("%d是水仙花数\n",n); 	else 		printf("%d不是水仙花数\n",n); }  void do2() { 	int a,b,t,i=0; 	printf("请输入年份"); 	scanf("%d%d",&a,&b); 	if(a>b) 	{ 		t=a; 		a=b; 		b=t; 	} 	while(a<=b) 	{ 		if(a%4==0&&a%100!=0||a%100==0) 			i=i+1; 		a=a+1; 	} 	printf("%d",i); }  int do3()  { 	char c; 	printf("沉梦昂志");  	c=getchar(); 	{ 		if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')) 		{ 			if ((c>='W'&&c<='Z')||(c>='w'&&c<='z'))c=c-22; 				else c=c+4; 		} 		printf("%c",c); 		c=getchar(); 	} 	printf("\n"); 	return 0; }  int menu()  {  	int  cn; 	printf("请输入指令:"); 	scanf("%d",&cn); 	return cn; }  int main()  {  	for(; ;) 	{  		switch(menu()) 		{  		case 1:  			do1(); break;  		case 2:  			do2(); break;  		case 3:  			do3();break; 		}  	}  }  楼主代码中do2()函数中scanf("%d%d",a,b);有语法错误，应该是scanf("%d%d",&a,&b);
user-0 提问: C语言定义结构体，里面有一个字符型指针数组 输出乱码

回复:
user: user-1
content: L->name[j]=strdup(name);

user: user-2
content: 应该说字符指针指向的字符串是不是全局的，输出时指向的字符串必须还存在。

user: user-3
content: 你在给name赋值的时候，需要用strcpy函数，且要保证name[i]有空间， L->name[j]=name;只是指向某个地方，那个地方函数推出就返回给系统了

user: user-2
content: bool ListInsert(StudentLi *L,int i,int id,int age,char name[],char sex) 参数char name[]是全局变量吗？
user-0 提问: 大神快来，strcpy函数是否会导致溢出？

回复:
user: user-1
content: 这是什么鬼代码？b申请了空间，但不赋值，又问字节里面是什么内容？乱码都有可能阿。

user: user-0
content: 感谢各位，我在linux里也试了一下，确实如 qldsrx说的结果。

user: user-2
content: 可能会出现溢出，需要程序元自己确保，现在新版VS默认需要使用安全的strcpy_s，该函数需要输入目标字符数组大小，来确保不会溢出。

user: user-3
content: 对了，你这个时候如果在return之前添加 free(b); 立刻程序崩溃，因为b这个对象释放时要查找b申请的大小，信息记录在其内存的前面，但被你改写了。

user: user-3
content: 我用gnu C在linux下测试是这样的结果，这个其实是和内存分配是否连续有关，如果两次申请的内存是连续内存空间，那么20字节再加上后面申请内存的头部字节（预估是12字节），这样下面一个申请的20字节正好偏移了32字节，自然就是你看到的结果了。

user: user-4
content: 溢出肯定会的。用strcpy时都会提示，这个函数不安全，建议用strcpy_s。 我在VS2013下，这段代码运行不起来。。就是因为这个函数。

user: user-5
content: 引用 6 楼 yupeigu 的回复:我用visual c++ 6.0 运行程序后，发现数组b都没有值的 你要干什么啊, 你又没给b赋值

user: user-0
content: 我用visual c++ 6.0 运行程序后，发现数组b都没有值的

user: user-3
content: T就是Technology的首字母，那后面的字母自然是e和c了

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

user: user-5
content: 引用 2 楼 yupeigu 的回复:[quote=引用 1 楼 qldsrx 的回复:] 溢出是肯定会的啊，只要不写入到受保护的内存地址，一般程序不会崩溃，但是这样就很可能会把其他变量的值给替换掉了，导致程序运行不稳定。  哦哦哦，明白。  现在的问题是，这段程序已知：  b[11] = T 那么 b[12] = 什么 以及 b[13] = 什么 [/quote] 不一定是什么吧 b和a可能离很远, T不一定是a里面的T

user: user-0
content: 引用 1 楼 qldsrx 的回复:溢出是肯定会的啊，只要不写入到受保护的内存地址，一般程序不会崩溃，但是这样就很可能会把其他变量的值给替换掉了，导致程序运行不稳定。  哦哦哦，明白。  现在的问题是，这段程序已知：  b[11] = T 那么 b[12] = 什么 以及 b[13] = 什么

user: user-3
content: 溢出是肯定会的啊，只要不写入到受保护的内存地址，一般程序不会崩溃，但是这样就很可能会把其他变量的值给替换掉了，导致程序运行不稳定。
user-0 提问: 冒泡法说有一个错误

回复:
user: user-1
content: 哪个单词不会直接百度，还能学点英语。

user: user-2
content: VS2010中文版的编译错误提示是中文的。

user: user-3
content: printf("请输入第%d个学生的成绩: "(i+1)); 少个逗号  printf("请输入第%d个学生的成绩: ",(i+1));
user-0 提问: 求大神看一下这个哪里出错了，初学者求教数人未果

回复:
user: user-1
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-1
content: printf("%f",&result); 改为 printf("%f",result);  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
user-0 提问: 求助！在其他电脑都可以运行，但自己电脑出现内存不能为read

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

user: user-2
content: 点取消调试程序

user: user-0
content: 我自己搞定了多谢帮助的人

user: user-0
content: @赵4老师 按alt+7并没有反应啊，可以说详细点吗，这个程序是没有问题的只有在我的电脑上运行会出现内存不能为read，多谢了

user: user-0
content: @user-2 程序没问题啊只有在我自己电脑上会出现这个问题
user-0 提问: 有关switch的问题

回复:
user: user-1
content: while((i=getchar())!=q) { switch(i) {...} fflush(stdin); }

user: user-1
content: 执行scanf("%lf",&x)时，输入数据后会有一个回车符‘\n’一起放在缓存，当x读取数据后，遇break退出switch，第二次循环会直接读取缓存里面的回车符，即i=‘\n’，所以就会跳到default

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

user: user-3
content: 像这种问题，自己加断点。一目了然

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] switch case里面的break和想退出循环时用的break貌合神离！ 此时最直接最简单的办法就是用goto语句goto到紧接循环外面和后面的下一条语句，如果刚好是退出函数的话，还可以用return。[/quote] 这里如果goto的循环外的话，就起不到多次选择要买的东西了。但是如果goto到switch外而在循环内的话，那岂不是结果不变，像1,2楼说的。

user: user-0
content: 引用 2 楼 anquan88 的回复:因为getchar()也会读取你按的回车键，进入第二次循环。 设个断点看看i的值。 这里我有个疑问，既然getchar会把回车也读进去，开始假设选a然后按回车，那就是把回车放到寄存器里了是吧，那为什么他还会进入到循环里面，而不是继续等待下一个输入字符一块放到寄存器里呢？

user: user-0
content: 我这个是在，vs2013中调试的。我也一直在思考4楼的问题  引用 4 楼 qq_30446977 的回复:[quote=引用 2 楼 奋起无迹的回复:]因为getchar()也会读取你按的回车键，进入第二次循环。 设个断点看看i的值。 我这有个问题。那个a选项后面不是有个break吗，那为什么还进入到第二次循环？[/quote]

user: user-2
content: 引用 5 楼 zhao4zhong1 的回复:switch case里面的break和想退出循环时用的break貌合神离！ 此时最直接最简单的办法就是用goto语句goto到紧接循环外面和后面的下一条语句，如果刚好是退出函数的话，还可以用return。

user: user-4
content: 我在VS2012下帮你调试不会运行到default

user: user-2
content: switch case里面的break和想退出循环时用的break貌合神离！

user: user-5
content: 引用 2 楼 奋起无迹的回复:因为getchar()也会读取你按的回车键，进入第二次循环。 设个断点看看i的值。 我这有个问题。那个a选项后面不是有个break吗，那为什么还进入到第二次循环？

user: user-6
content: 回车被读取了

user: user-0
content: 嗯，懂了，谢谢各位大神

user: user-7
content: 你的情况应该是将回车字符作为一次输入，所有会再进入default一次。我测试的结果，试着随便输入一个数字5回车显示结果是进入两次default。应该用给scanf();输入之后加上getchar(),就好了。getchar()作用是吃掉非法字符

user: user-8
content: 引用 9 楼 xiaoxiaoqiang666 的回复:[quote=引用 2 楼 anquan88 的回复:] 因为getchar()也会读取你按的回车键，进入第二次循环。 设个断点看看i的值。 这里我有个疑问，既然getchar会把回车也读进去，开始假设选a然后按回车，那就是把回车放到寄存器里了是吧，那为什么他还会进入到循环里面，而不是继续等待下一个输入字符一块放到寄存器里呢？[/quote]  http://baike.baidu.com/link?url=glkSPh9bVshd35jmw_W2hOoB-0xFQZ-9CHt3mMUGQtv2hR1Tc9yTcdc6mW2njQ5c2E4AYN7i6BpPXrDrVGrhnq 仔细看看就明白了。

user: user-9
content: 引用 2 楼 奋起无迹的回复:因为getchar()也会读取你按的回车键，进入第二次循环。 设个断点看看i的值。 2楼说的很对，赞一个。受益匪浅。

user: user-8
content: 因为getchar()也会读取你按的回车键，进入第二次循环。 设个断点看看i的值。

user: user-5
content: 肯定是回车被接收了，也被switch函数作为参数去检验了，所以才会出现除外的情况。但是怎么解决我也不知道。
user-0 提问: C语言的三级指针指向内存地址的问题

回复:
user: user-1
content: 多级指针并没有什么神奇，递归定义罢了~

user: user-2

user: user-3
content: 中间任何一级都不能跳过

user: user-4
content: 《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！ //在堆中开辟一个3×4×5的3维int数组 #include <stdio.h> #include <malloc.h> int ***p; int i,j,k; void main() {     p=(int ***)malloc(3*sizeof(int **));     if (NULL==p) return;     for (i=0;i<3;i++) {         p[i]=(int **)malloc(4*sizeof(int *));         if (NULL==p[i]) return;         for (j=0;j<4;j++) {             p[i][j]=(int *)malloc(5*sizeof(int));             if (NULL==p[i][j]) return;         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 p[i][j][k]=i*20+j*5+k;             }         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 printf(" %2d",p[i][j][k]);             }             printf("\n");         }         printf("---------------\n");     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             free(p[i][j]);         }         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //--------------- // 20 21 22 23 24 // 25 26 27 28 29 // 30 31 32 33 34 // 35 36 37 38 39 //--------------- // 40 41 42 43 44 // 45 46 47 48 49 // 50 51 52 53 54 // 55 56 57 58 59 //---------------

user: user-3
content: 多级指针，必须逐级赋值（初始化），否则是野指针
user-0 提问: 为什么vc6上可以完美运行的代码到vs2015上编译可通过但不能达到预期效果？

回复:
user: user-0
content: 都说了不是system（"pause"）的问题,怎么有这么多人还是回答这个，无语。 自己把问题解决了，还是vs2015的标准问题，为了不用scanf_s特意在工程属性里加了一行_CRT_SECURE_NO_DEPRECATE 结果问题就解决了。

user: user-1
content: 引用 5 楼 弓长羊羽的回复:[quote=引用 4 楼 Ounce1 的回复:] VC6和VS2015的标准不同，举个简单的例子i=5,k=(i++)+(++i)+(++i)在VC中k=13,在VS2015里是15,他们采用的C语言标准不同，建议还是以VS2015为准，VC6太老了 这个问题与C标准无关~[/quote] 诶，那和什么有关？一直觉得是标准的问题，不过好像Dev运行的结果是14，反正我觉得以vs为准没错

user: user-2
content: 引用 8 楼 Ounce1 的回复:[quote=引用 5 楼 弓长羊羽的回复:][quote=引用 4 楼 Ounce1 的回复:] VC6和VS2015的标准不同，举个简单的例子i=5,k=(i++)+(++i)+(++i)在VC中k=13,在VS2015里是15,他们采用的C语言标准不同，建议还是以VS2015为准，VC6太老了 这个问题与C标准无关~[/quote] 诶，那和什么有关？一直觉得是标准的问题，不过好像Dev运行的结果是14，反正我觉得以vs为准没错[/quote] 不管哪个都是错的,在你这么写的时候就注定了没有正确答案.

user: user-3
content: Ctrl+F5 运行

user: user-4
content: VS2015表示并没有什么问题

user: user-5
content: 引用 4 楼 Ounce1 的回复:VC6和VS2015的标准不同，举个简单的例子i=5,k=(i++)+(++i)+(++i)在VC中k=13,在VS2015里是15,他们采用的C语言标准不同，建议还是以VS2015为准，VC6太老了 这个问题与C标准无关~

user: user-1
content: VC6和VS2015的标准不同，举个简单的例子i=5,k=(i++)+(++i)+(++i)在VC中k=13,在VS2015里是15,他们采用的C语言标准不同，建议还是以VS2015为准，VC6太老了

user: user-6
content: ctrl+f5运行

user: user-7
content: Ctrl+F5 运行  或者最后加getchar();  否则程序运行完竟然退出了

user: user-8
content: 在return 0;前面加个 getchar() 或者system("pause")
user-0 提问: C程序求助

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> #include <time.h> struct tm st; time_t tt; char timstr[40]; char tmpbuf[128]; char c; int t; int AP() {     if ('P'==c || 'p'==c) {st.tm_hour+=12;return 1;}     if ('A'==c || 'a'==c)                 return 1;                                           return 0; } int dtparse() {     if (7==sscanf(timstr,"%d/%d/%4d %d:%d:%d %c",&st.tm_mday,&st.tm_mon ,&st.tm_year,&st.tm_hour,&st.tm_min,&st.tm_sec,&c)) if (AP()) goto STEP2;     if (6==sscanf(timstr,"%d/%d/%4d %d:%d%c"    ,&st.tm_mday,&st.tm_mon ,&st.tm_year,&st.tm_hour,&st.tm_min           ,&c)) if (AP()) goto STEP1;     if (6==sscanf(timstr,"%4d/%d/%d %d:%d %c"   ,&st.tm_year,&st.tm_mon ,&st.tm_mday,&st.tm_hour,&st.tm_min           ,&c)) if (AP()) goto STEP1;     if (5==sscanf(timstr,"%d.%d.%4d %d:%d"      ,&st.tm_mon ,&st.tm_mday,&st.tm_year,&st.tm_hour,&st.tm_min              ))           goto STEP1;     if (6==sscanf(timstr,"%4d-%d-%d %d:%d:%d"   ,&st.tm_year,&st.tm_mon ,&st.tm_mday,&st.tm_hour,&st.tm_min,&st.tm_sec   ))           goto STEP2; STEP1:     st.tm_sec=0; STEP2:     st.tm_year-=1900;     if (st.tm_mon>12) {t=st.tm_mon;st.tm_mon=st.tm_mday;st.tm_mday=t;}     st.tm_mon-=1;     tt=mktime(&st);     if (-1!=tt) {         strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S",localtime(&tt));         return 1;     } else {         printf("[%s] is Invalid time string!\n",timstr);         return 0;     } } int main() {     strcpy(timstr,"10.01.2012 15:43"        );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);     strcpy(timstr,"8/11/2006 11:10AM"       );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);     strcpy(timstr,"2006/10/31 04:50 PM"     );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);     strcpy(timstr,"1/6/2010 5:20:12 PM"     );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);     strcpy(timstr,"13/12/2012 11:16:17 a.m.");if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);     strcpy(timstr,"2013-06-08 09:56:59"     );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);     return 0; } //[10.01.2012 15:43] is [2012-10-01 15:43:00] //[8/11/2006 11:10AM] is [2006-11-08 11:10:00] //[2006/10/31 04:50 PM] is [2006-10-31 16:50:00] //[1/6/2010 5:20:12 PM] is [2010-06-01 17:20:12] //[13/12/2012 11:16:17 a.m.] is [2012-12-13 11:16:17] //[2013-06-08 09:56:59] is [2013-06-08 09:56:59] //

user: user-0
content: 恩，是作业。

user: user-2
content: 这是作业作业？
user-0 提问: C语言运行过程中修改变量

回复:
user: user-0
content: 引用 3 楼 lm_whales 的回复:因为C语言，没有运行时类型信息。 C的类型信息，只在编译期间有效。 只有自己采取措施，才能解决 1）同一 名字， 2）同一内存， 等 同一事物，表示不同内容的方法。  谢谢

user: user-1
content: 因为C语言，没有运行时类型信息。 C的类型信息，只在编译期间有效。 只有自己采取措施，才能解决 1）同一 名字， 2）同一内存， 等 同一事物，表示不同内容的方法。

user: user-2
content: 当然你可以用union，一块内存可以同时表示多种类型变量，或者使用指针，然后转换指针类型去解释同一个变量，这样的话可以

user: user-2
content: 这是语法规定，你要修改变量类型可以重新申明一个对象 随便一个可以运行的程序都是例子，因为他们都得遵循这个前提
user-0 提问: 求帮忙！！！

回复:
user: user-1
content: 修改如下：   #include <stdio.h>, int b(int s) { 	int f1 = 0, f2 = 1, fn; 	fn = f1 + f2; 	while(fn <= s) 	{ 		fn = f1 + f2; 		f1 = f2; 		f2 = fn; 	} 	return fn; } int main() { 	int s; 	printf("please input : "); 	scanf("%d", &s); 	printf("%d\n", b(s)); 	return 0; }

user: user-2
content: fn没初始化，里面的数值是不定的。 再运行几次看看。

user: user-3
content: 单步调试一下不就ok了
user-0 提问: Inet——addr（）

回复:
user: user-0
content: 问题是sacnf("%s\n",ip);这句话  我多加了一个换行符

user: user-1
content: s_addr和S_addr不是一回事！

user: user-2
content: 我自己写的函数，用来获取ip地址的uint表示形式，也就是你那个server_addr.sin_addr.s_addr的值，处理速度超快（第二个参数输出IP，返回值为字符串的下一个指针位置，为NULL表示IP字符串格式有误）  #include <sys/types.h> #include <stdint.h> char const dex_table[256] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02,         0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; char* getip(char *input, uint *ip) {     uint tmp = 0, i = 0;     uint8_t *src = (uint8_t*) input, *dst = (uint8_t *) ip, value;     *ip = 0;     while ((value = *src++)) {         if (dex_table[value] != -1)         break;     }     do {         if (value == '.') {             dst[i] = tmp;             tmp = 0;             if (i++ == 3)             return (char*) src;         } else {             if (dex_table[value] == -1)             break;             tmp = (tmp << 3) + (tmp << 1) + dex_table[value];         }         if (tmp > 0xff) return NULL;     }     while ((value = *src++));     if (i == 3) {         if (tmp > 255)         return NULL;         dst[3] = tmp;         return (char*) src;     }     return NULL; }

user: user-3
content: 编译器有什么提示
user-0 提问: 定义一个大小为10的整形数组，使用初始化方法为数组元素赋初值，编程计算这10个元素的平均值，并查找比平均值大的数组元素。

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

user: user-2
content: 楼主的aver计算是除了10次10，把aver这个放到for循环外部

user: user-0
content: 引用然后呢，你那个求平均的位置也不对，怎么能在循环里面呢？这里确实写错了

user: user-3
content: 然后呢，你那个求平均的位置也不对，怎么能在循环里面呢？

user: user-3
content: 没调试过，但是我觉得吧 首先你sum是 int类型的 然后你sum/10最后的结果应该也是int类型。 你这样强制转成double类型应该会有问题才对。

user: user-0
content: 引用aver=(sum*1.00)/10;这里的写法有什么意义？？结果是对的，这里的写法是对他的和值进行一个格式定义吗？？

user: user-4
content: aver=(sum*1.00)/10;

user: user-0
content: 会不会是定义类型出了错？？或者输出格式出现了错误？

user: user-0
content: 引用aver=sum/10,这个语句的位置写错了，应写在循环外面。然后有个建议，所有循环里面的printf函数最好加个\n，这样更容易看。 写在外循环还是不对

user: user-5
content: 楼上两个说的很对，赞一下。

user: user-6
content: aver=sum/10,这个语句的位置写错了，应写在循环外面。然后有个建议，所有循环里面的printf函数最好加个\n，这样更容易看。

user: user-7
content: 修改如下：  #include<stdio.h> #include<math.h> int main() { 	int i; 	double sum, aver; 	double a[10] = { 3,6,1,7,8,4,9,5,10,2 }; 	printf("数组中的初值是:\n "); 	for (i = 0; i < 10; i++) 	{ 		printf("%g ", a[i]); 	} 	printf("\n"); 	sum = a[0]; 	printf("平均值是："); 	for (i = 1; i < 10; i++) 	{ 		sum += a[i]; 	} 	aver = sum / 10; 	printf("%g\n", aver); 	printf("数组中比平均值大的数是："); 	for (i = 0; i < 10; i++) 	{ 		if (a[i] > aver) 			printf("%g\t", a[i]); 	} 	printf("\n"); 	return 0; } //数组中的初值是: //3 6 1 7 8 4 9 5 10 2 //平均值是：5.5 //数组中比平均值大的数是：6	 7	 8	 9 	10
user-0 提问: 关于strcat的问题

回复:
user: user-1
content: C中字符串以'\0'结尾，你\0后就算还有其他内容，输出时字符串也只判断到\0为止，所以后面的东西显示不出来 另外strcat直接strcat(p,"World"); 这样用，他连接时会自动判断字符串结尾的，不需要写成p+5

user: user-2
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strcat.c /*** *strcat.c - contains strcat() and strcpy() * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       Strcpy() copies one string onto another. * *       Strcat() concatenates (appends) a copy of the source string to the *       end of the destination string, returning the destination string. * *******************************************************************************/  #include <cruntime.h> #include <string.h>  #ifndef _MBSCAT #pragma function(strcat,strcpy) #endif  /* _MBSCAT */  /*** *char *strcat(dst, src) - concatenate (append) one string to another * *Purpose: *       Concatenates src onto the end of dest.  Assumes enough *       space in dest. * *Entry: *       char *dst - string to which "src" is to be appended *       const char *src - string to be appended to the end of "dst" * *Exit: *       The address of "dst" * *Exceptions: * *******************************************************************************/  char * __cdecl strcat (         char * dst,         const char * src         ) {         char * cp = dst;          while( *cp )                 cp++;                   /* find end of dst */          while( *cp++ = *src++ ) ;       /* Copy src to end of dst */          return( dst );                  /* return dst */  }   /*** *char *strcpy(dst, src) - copy one string over another * *Purpose: *       Copies the string src into the spot specified by *       dest; assumes enough room. * *Entry: *       char * dst - string over which "src" is to be copied *       const char * src - string to be copied over "dst" * *Exit: *       The address of "dst" * *Exceptions: *******************************************************************************/  char * __cdecl strcpy(char * dst, const char * src) {         char * cp = dst;          while( *cp++ = *src++ )                 ;               /* Copy src over dst */          return( dst ); }  void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      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++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?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++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }
user-0 提问: 求12864显示超声波测距的多级菜单程序

回复:
user: user-1
content: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=12864%E6%98%BE%E7%A4%BA%E8%B6%85%E5%A3%B0%E6%B3%A2%E6%B5%8B%E8%B7%9D%E7%9A%84%E5%A4%9A%E7%BA%A7%E8%8F%9C%E5%8D%95%E7%A8%8B%E5%BA%8F&oq=%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%20%E5%B9%BF%E6%92%AD%E5%9C%B0%E5%9D%80&rsv_pq=b0d78b110001a0d4&rsv_t=48c4UlKIhFhAtqnSXUFkKknWz%2BroY%2FPv%2FKs0D3k0xv6HqJT9%2FH%2FRiQBdfTY&rsv_enter=0&inputT=8832&rsv_n=2&rsv_sug3=4&bs=%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%20%E5%B9%BF%E6%92%AD%E5%9C%B0%E5%9D%80
user-0 提问: 辗转相除法求最大公约数

回复:
user: user-1
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-0
content: 按照大家提的意见改了，但是还是出错。。难道是我的编译器的问题？我用的dev c++

user: user-2
content: http://www.baidu.com/s?wd=辗转相除法求最大公约数+c&ie=UTF-8

user: user-3
content: 引用 4 楼 wang0635 的回复:scanf("%d，%d",&u,&v); 中间的中文逗号，你输入了吗？ 其他没有什么问题，不用考虑谁大谁小，循环一轮后就进入正轨了 最好改成 scanf("%d%d",&u,&v);  同意。

user: user-4
content: scanf("%d，%d",&u,&v); 中间的中文逗号，你输入了吗？ 其他没有什么问题，不用考虑谁大谁小，循环一轮后就进入正轨了 最好改成 scanf("%d%d",&u,&v);

user: user-5
content: 参看：http://blog.csdn.net/cyg0810/article/details/7980402

user: user-6
content: 这样行吗 int gcd(int a,int b){         return !b ? a : gcd(b,a%b);     }

user: user-7
content: v和u要先比较大小，用大的那个除以小的取余
user-0 提问: C/C++

回复:
user: user-1
content: while(j=100000-S.right!=10)     {     while(j<10)         {         n=S.data[position][0];         t=0;         for(i=0;i<n;i++)         {             if(S.data[S.left][0]>n)              {                 S.data[S.right][1]=S.data[S.left][1];                 S.data[S.right--][0]=S.data[S.left][0];                 S.left--;             }             else             {                 k=S.data[t][0];                 m=S.data[t][1];                 S.data[t][1]=S.data[S.left][1];                 S.data[t++][0]=S.data[S.left][0];                 S.data[S.left][1]=m;                 S.data[S.left][0]=k;             }         }         position++;     } 赋值运算符的优先级低于关系运算符所以j=100000-S.right!=10应改为（j=100000-S.right）!=10  while(j<10)   {   ................ }你的这条循环语句感觉好像要么不循环，要么死循环 还有你的for循环语句好像也有问题吧，假如S.data[S.left][0]到S.data[0][0]之间S.data[S.left][0]最大而S.data[0][0]最小，那不是怎么循环都没有结果么

user: user-2
content: 学会下断点调试~

user: user-3
content: Students S;     S.left=-1;            S.right=100000;     int i,j,t,k,m,position=0,n;     scanf("%ld %d",&n,&k);     for(;S.left<n;S.left++)     {            scanf("\n");            S.data[S.left][0]=0;                for(j=0;j<=k;j++)         {             scanf("%d",&t);             getchar();             if(j==0) S.data[S.left][1]=t;     //前面 S.left=-1，这儿不会出错吗             else S.data[S.left][0]=S.data[S.left][0]+t;         }     }

user: user-4
content: 输入输出是什么? 直接快速排序, 得出前10个就可以,,
user-0 提问: GDB分屏显示的时候，如何移动GDB的命令行中的光标

回复:
user: user-1
content: 在GDB文本界面中，有4个窗口： command 命令窗口.，可以键入调试命令 source 源代码窗口.，显示当前行,断点等信息 assembly ，汇编代码窗口 register ，寄存器窗口 可以使用focus  next命令将窗口的焦点进行下移，就可以在cmd窗口进行以前的那种操作了。

user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:http://my.oschina.net/jiangwave/blog/126552 ？我已经知道了，使用Ctrl+x+a这个快捷键可以进行分屏的切换，也就可以退出分屏的显示了。

user: user-1
content: 您好，请问楼主知道gdb如何退出当前分屏吗？

user: user-2
content: http://my.oschina.net/jiangwave/blog/126552 ？
user-0 提问: 结构体指针成员和数组成员赋值的区别

回复:
user: user-1
content: 结构体整体复制，本来是不可以的，后来可以了（包括内含数组的结构体，但是用初始化表初始化，似乎还不可以， C++11就不清楚了） 结构体初始化，则始终可以。

user: user-2
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-3
content: 另外： struct A a={"hello"};        //结构体指针成员可以初始化  struct B b={"hello"};        //结构体数组成员可以初始化   这两句中，第一句是让结构体中的name指向常量区中的字符串，第二句则是复制到数组中 结构体初始化时语法允许这样写，其他时候则不允许这样写（包括已初始化后的结构体不能再这样进行赋值）

user: user-3
content: 引用 1 楼 user-8 的回复:听说普通数组也可以赋值     char  name[20];     name = "hello1";  这种肯定不可以

user: user-3
content: 数组的指针是个常量，你不能改变他的值（他指向的位置），只能把内容复制进去 而写成char*则只是一个指针，a.name="hello1";则让他指向了常量区的hello1字符串，故可行  char[50]数组你定义时就分配好了50的大小，故可以复制内容进去 而char*只是一个指针，你定义后他可能指向任何位置，并没为你分配任何空间，如果需要strcpy，可以动态分配一块内存，如：b.name = new char[50];

user: user-4
content: char *name name是个指针变量, 可以直接把地址赋给它 char name[20] name是个数组名, 已经是个地址了

user: user-0
content: 谢谢大家～～～～～～～

user: user-5
content: 这个和结构体没关系。  引用 楼主 zzl_zZ 的回复:#include <stdio.h> #include<string.h> struct A { 	char *name; }; struct B { 	char name[50]; }; int main(void) { 	struct A a={"hello"};		//结构体指针成员可以初始化 //上面A中只有一个char*指针，而hello是放在常量区的，a={"hello"}只是让指针指向了常量区的hello，成员变量name没有分配内存，他只是一个指针变量  	struct B b={"hello"};		//结构体数组成员可以初始化 这个b成员变量是数组，当初始化结构体的时候为成员变量分配了50个字符空间，所以，这个hello不会在常量区存放，会直接存在分配的50个字符空间中。他与A中的char*型变量不同，char*成员变量在结构体a初始化时只分配了一个指针变量的空间，一般是4个字节或者8个字节(这和平台有关) 	a.name="hello1";			//指针成员可以直接赋值 //这里指针可以直接赋值，是因为可以改变a中的指针变量name的指向，指向了常量区的"hello1“，注意name只是改变了指向 	b.name="hello1";			//error 数组成员不能这样赋值 //上面b是数组，数组没有这样赋值的。 	strcpy(a.name,"hello2");	//error 指针成员不能这样赋值  需要用malloc分配内存才行  //strcpy两个参数实际上是两个数组，第一个参数是需要有分配空间来接收第二个参数的值，因此第一个参数不能是没有分配空间的指针 	strcpy(b.name,"hello2");	//数组成员可以这样赋值  //b的name是数组，可以调用strcpy，strcpy实际上是内存拷贝，第二个可以字符串常量或者数组或者分配空间的指针变量。 	return 0; }  为什么结构体变量两种不同成员的赋值的方式都不一样？ 普通数组变量和指针变量都可以这样赋值啊。。。

user: user-6
content: 字符串指针变量和字符串数组之间的差别…

user: user-7
content: 这个问题和结构体关系不大。关键是数组在定义完成后不能再赋值的。  可以把数组名理解为一个指针常量： 定义的时候可以让它指向一个字符串，之后就不能再指向别的字符串了。

user: user-8
content: 听说普通数组也可以赋值     char  name[20];     name = "hello1";
user-0 提问: 求帮忙啊！！

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: 我觉得应该这样才好 #include<stdio.h> int main(void) { 	double a=0,i=14875,j=17850,k=23900,l=29750,sum=0; 	double m=0.15,n=0.28; 	printf("您的收入：\n"); 	scanf("%lf",&a); 	 	if(j>a>i) 	sum=i*m+(a-i)*n; 	else if(k>a>j) 	sum=j*i+(a-j)*n; 	else if(l>a>k) 	sum=k*m+(a-k)*n; 	else if(a>l) 	sum=l*m+(a-l)*n; 	else 	sum=a*m; 	printf("税金：%.2lf\n",sum); 	return 0; }

user: user-0
content: 谢谢各位大神，一下子明白了。嘿嘿。这道题要求是用switch来编写的。

user: user-3
content: 楼主调用scanf("%d", t);的目的是让scanf函数把用户输入的值放到变量 t 里。 可是，要想让一个函数把信息通过参数反馈回来，这个参数就需要是某变量的地址。  楼主的这种写法，scanf（）会把t的值（0，也就是0x00000000)当做变量的地址，用户输入数据后， scanf就会试图在0x00000000起始的地址写入数据，引起异常。  另外，楼主网上查询下pass by value和pass by reference这两个概念的区别会对处理类似问题有帮助的。

user: user-4
content: scanf("%d", t);  改成  scanf("%d", &t);  其他scanf的地方同理改

user: user-0
content: 我看不懂哎，麻烦能不能讲清楚点啊，大锅

user: user-5
content: C语言的类型不安全不适合新手啊.
user-0 提问: 链式存储结构多项式加法错在哪里？

回复:
user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:学会设置断点调试~ 一元多项式参考：http://blog.csdn.net/zhangxiangdavaid/article/details/31032251 看完了灰常感谢

user: user-1
content: 学会设置断点调试~ 一元多项式参考：http://blog.csdn.net/zhangxiangdavaid/article/details/31032251
user-0 提问: fwrite读写文件

回复:
user: user-1
content: 引用 2 楼 zhanglusmile 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  其实一直没懂，是什么意思？？ [/quote] 不懂，就尝试下~

user: user-2
content: 在内容写入之后或文件关闭之前调用一下fflush函数试试。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  其实一直没懂，是什么意思？？

user: user-3
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了
user-0 提问: cfree5.0练代码

回复:
user: user-1
content: 没有具体提示"5 个错误, 1 个警告"是什么么？ 另外，看你用了中文，自己好好查查是不是代码里有符号不小心也输入了中文（全角）的

user: user-2
content: 引用 4 楼 baidu_32324411 的回复:一开始打开CFREE要怎么设置,直接关闭弹出的对话框吗??????? 定位错误~

user: user-2
content: 引用 7 楼 baidu_32324411 的回复:IDE环境  是什么  求详解? http://baike.baidu.com/link?url=J2cZN94zywPOP2C7j26T-jK8z3OTQaCvmVbfUGSoFotGpx772Peas00ph7yJZNb7NZKQb1SoSMNkktdNHJTx6TiSkVgooq4BK-r34Q5Rmc3

user: user-0
content: 重装软件没用,还是显示有错.

user: user-3
content: 我运行了没有问题 建议你卸载重装软件

user: user-0
content: IDE环境  是什么  求详解?

user: user-4
content: cfree没有用过，是不是IDE环境没有配好？

user: user-5
content: 没给文件命名吧，文件名现在是未命名.cpp

user: user-6
content: 直接关闭弹出来的那个，然后左上角文件新建

user: user-0
content: 一开始打开CFREE要怎么设置,直接关闭弹出的对话框吗???????

user: user-2
content: 粗略看下，没什么问题~