Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 大家好，编写了一个简单的程序涉及到浮点乘法，怎么一直错啊！

回复:
user: user-1
content: 把distance(pointArray[i], pointArray[++i]);改为distance(pointArray[i++], pointArray[i]);就好。 在同一语句中，i++和++i比i优先级高，当同一语句同时出现多个i++或++i，则遵循右结合性。 另外就是i++和++i的区别，这个应该都知道的。

user: user-2
content: 函数压值从右到左, 但i的求值顺序未定, 同一表达式中尽量不要用这种, %lf仅在scanf中有用, 在printf中并未定义

user: user-0
content: 引用 2 楼 Evankaka 的回复:for (i = 0; i < NUMBER; ++i)     {         distance(pointArray[i], pointArray[++i]);     } 这里会数组溢出了，NUMBER=2，i=1时，pointArray[++i]会了取到pointArray[2] 谢谢！

user: user-0
content: 引用 4 楼 xiaohuh421 的回复:for (i = 0; i < NUMBER; ++i)     {         distance(pointArray[i], pointArray[++i]);     }  这里的++i不知道你的目的是什么. 但最好不要写这样的自己都理解不了的方式. 修改成如下方式.  for (i = 0; i < NUMBER; ++i)     {         distance(pointArray[i], pointArray[i+1]); //++i  , 我理解成你想是要先+1, 再使用.          ++i; //这里才让i再加1.     } 我想法正确，实现错误，忘了函数的参数计算顺序了，谢谢！

user: user-3
content: for (i = 0; i < NUMBER; ++i)     {         distance(pointArray[i], pointArray[++i]);     }  这里的++i不知道你的目的是什么. 但最好不要写这样的自己都理解不了的方式. 修改成如下方式.  for (i = 0; i < NUMBER; ++i)     {         distance(pointArray[i], pointArray[i+1]); //++i  , 我理解成你想是要先+1, 再使用.          ++i; //这里才让i再加1.     }

user: user-0
content: 引用 3 楼 u013250461 的回复:for (i = 0; i < NUMBER; ++i)     {         distance(pointArray[i], pointArray[++i]);     } 这里的函数调用错了,虽然我还没看明白为啥错了, 初步估计是++i的问题吧,  你把它改成    distance(pointArray[0], pointArray[1]); 就对了,具体原因还没搞明白,如果漏主搞明白,希望给我回一下,谢了 看了一下下大家的回复才想到，是函数压栈顺序是从右到左，这样一来先计算++i，因此两个相等，而且还会出现边界溢出！

user: user-4
content: 压栈顺序，单步看反汇编吧

user: user-5
content: for (i = 0; i < NUMBER; ++i)     {         distance(pointArray[i], pointArray[++i]);     } 这里的函数调用错了,虽然我还没看明白为啥错了, 初步估计是++i的问题吧,  你把它改成    distance(pointArray[0], pointArray[1]); 就对了,具体原因还没搞明白,如果漏主搞明白,希望给我回一下,谢了

user: user-6
content: for (i = 0; i < NUMBER; ++i)     {         distance(pointArray[i], pointArray[++i]);     } 这里会数组溢出了，NUMBER=2，i=1时，pointArray[++i]会了取到pointArray[2]

user: user-7
content: 请看置顶贴，函数参数的求值顺序是不确定的
user-0 提问: 这是什么回事，求大神解释！！！

回复:
user: user-1
content: #include<stdio.h> int main(void) {   int i,count1=0,count2=0;   int sum1=0,sum2=0;      printf("请输入整数：\n");   while(scanf("%d",&i) == 1)   {       if((i%2) == 0) 	  { 	     count1++; 		 sum1 += i; 	  } 	  else 	  { 	     count2++; 		 sum2 += i; 	  }   }      printf("您输入的偶数总个数为：%d，偶数的平均值为%f",count1,1.0*sum1 / count1);   printf("您输入的奇数总个数为：%d，奇数的平均值为%f",count1,1.0*sum2 / count2);   return 0; }

user: user-2
content: C式可变参数，编译时，无法直接类型匹配，这样 整型到浮点的提升（转换）就不会有 C式样可变参数，内部类型的类型提升（转换），是按照固有方式处理，而不是按照两种类型的转换规则处理

user: user-2
content: sum1 / count1 结果不是浮点数 浮点数和整数， 在 可变参数的函数中，获取和表示方法不一致 估计产生了浮点处理器错误（异常）

user: user-3
content: count1,count2,sum1,sum2;没有初始化，系统会为其分配一个随机数，这个数不可预料，你可以插断点看看

user: user-4
content: 引用了不可用内存
user-0 提问: 求两百万以下质数和出问题

回复:
user: user-1
content: 引用 4 楼 kamenriderdrive 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers 这么高大上的东西！！！[/quote]

user: user-2
content: 明显是整数溢出了，用long long试试

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers 这么高大上的东西！！！

user: user-0
content: 引用 2 楼 kuangbao9 的回复:这是你程式运行的结果：1179908154。不对吗？ 我也觉得没错，但是ProjectEuler上说不对

user: user-3
content: 这是你程式运行的结果：1179908154。不对吗？

user: user-1
content: Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-0
content: 引用 3 楼 kamenriderdrive 的回复:[quote=引用 2 楼 kuangbao9 的回复:] 这是你程式运行的结果：1179908154。不对吗？ 我也觉得没错，但是ProjectEuler上说不对[/quote] 是整数溢出了。。。

user: user-0
content: 引用 6 楼 kuangbao9 的回复:142913828922这个结果对不对？ 对的对的

user: user-4
content: 素数的个数 = π(x)≈x/Lnx 很可能溢出了

user: user-5
content: j j 过大

user: user-3
content: 142913828922这个结果对不对？
user-0 提问: 关于while 循环的问题？

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

user: user-2
content: #include <stdio.h> int main() { 	long num = 0L, sum = 0L; 	while (true) { 		if (!scanf("%ld", &num)) { 			setbuf(stdin, NULL); 			printf("输入错误，请重新输入\n"); 			continue; 		} 		printf("sum = %ld\n", sum+=num); 	} 	return 0; }  这一切都是命运石之门的选择

user: user-3
content: 引用 3 楼 dag617712 的回复:楼上的应该是高手，很多程式没见过 这里是C语言，他用的是C++中的STL来实现。  楼主，你是不是想说，因为用了 scanf("%ld",&num) ，然后输入非数字没反应，希望能输入非数字能给个提示？ 我觉得吧，命令行程序不是专门用于交互的，所以没必要让它多智能应对。若你的需求如我说的，就是给个提示，还是有办法的，就是用getc获取字符，如果它是数字，就ungetc回去，否则就给提示。我不是很明白，你说的不用if只用while是什么意思。

user: user-4
content: 楼上的应该是高手，很多程式没见过

user: user-5
content: 可以考虑这么做。输入的数据格式为:1 2 3 4 4 6中间4 空格，输完后回车就可以了。  #include<iostream> #include<vector> using namespace std; int main(){     vector<int> ivec;     int i;     char ch;    cout<<" qingshuru"<<endl;     while(cin>>i)    {         ivec.push_back(i);         ch = getchar();         if(ch=='\n')//输入回车键时接收数据结束             break;    }     for(int j=0;j<ivec.size();j++)       cout<<ivec[j];}

user: user-6
content: while(term = scanf("%ld",&num);)  {  sum=sum+num;  printf("sum=%ld\n",sum); getchar();  }
user-0 提问: 深度优先搜索问题

回复:
user: user-1
content: 引用 2 楼 dcy652701 的回复:[quote=引用 1 楼 user-1 的回复:] 要输出789,象你屏蔽起点那样,把大于9的都去掉 要输出7 11 8 9, 只能改你的邻边表了  这个是邻边表，7->8->9成功了，该怎么改一下邻边表呢，才能显示7->11->8->9[/quote]7的邻边改成 7-6-11-8

user: user-0
content: 引用 1 楼 user-1 的回复:要输出789,象你屏蔽起点那样,把大于9的都去掉 要输出7 11 8 9, 只能改你的邻边表了  这个是邻边表，7->8->9成功了，该怎么改一下邻边表呢，才能显示7->11->8->9

user: user-1
content: 要输出789,象你屏蔽起点那样,把大于9的都去掉 要输出7 11 8 9, 只能改你的邻边表了
user-0 提问: 字符转义和字符串字面值的转义有什么区别

回复:
user: user-0
content: 3 L呢？  我测试过，是不是测试不对？

user: user-1
content: 引用 2 楼 caddor9100 的回复:[quote=引用 1 楼 GKatHere 的回复:] 1:   ' ' 可以括一串， ULONG a = 'dcba'; 2:   "可以单独使用？ char a = "    ????? 我问的是 字符转义和字符串中的转义[/quote] char a = '\"';  转义\"  char* a = "abcd\"def"; 中间", 必须是转义\"; char b = '"'; 中间"可以不是转义\"

user: user-0
content: 第2个问题:  #include<stdio.h> int main() {     fun();     printf("\a");     printf("%d",sizeof(long int));     return 0; } void fun() { }        不是说c89规定，必须先申明后使用  c99，则没有规定。

user: user-0
content: 引用 1 楼 GKatHere 的回复:1:   ' ' 可以括一串， ULONG a = 'dcba'; 2:   "可以单独使用？ char a = "    ?????   我问的是 字符转义和字符串中的转义

user: user-2
content: 就是一个单引号'' 和，双引号“” 的 区别， 所以 双引号内，要写双引号字符，就需要转义，单引号内不必 反之亦然  另外可以有空串""（只包含 \0）， 不存在空字符‘’，只有序号为0 的字符，和空格字符等等

user: user-1
content: 1:   ' ' 可以括一串， ULONG a = 'dcba'; 2:   "可以单独使用？ char a = "    ?????

user: user-0
content: 3 L
user-0 提问: 父进程如何访问子进程的私有空间？如代码所示

回复:
user: user-1
content: 同意赵老师的说法 ... 不过最好是父进程以调试模式打开子进程

user: user-2
content: 用管道，父子进程间用无名管道，如果无血缘关系的进程间用有名管道即可。

user: user-3
content: ReadProcessMemory

user: user-4
content: linux下，子进程可以读父进程的内存。其它不可以。 看下进程间通信方面的知识吧。

user: user-5
content: 每个进程各自有不同的用户地址空间，任 何一个进程的全局变量在另一个进程中都看不到，所以进程之间要交换数据必须通过内核，在内核中开辟一块缓冲 区，进程1把数据从用户空间拷到内核缓冲区，进程2再从内核缓冲区把数据读走，内核提供的这种机制称为进程间通信（IPC，InterProcess Communication）。

user: user-6
content: 内存映射文件 createfilemapping、mapviewoffile之类的。
user-0 提问: 一段c语言代码，小问题，求指出无法运行的原因

回复:
user: user-1
content: check_num( p+i )

user: user-2
content: void cheak_num(int*);//声明一个数字输入检查函数  p=(int *)malloc(quality * sizeof(int));//分配内存  printf("The %d number is: %d",i+1,  *(p+i));

user: user-3
content: 楼主，你的调用声明好乱啊 首先声明函数void cheak_num(int)，可是在定义时void cheak_num(int * add)，参数就变成指针 第二函数调用cheak_num(&quality)，给函数传递一个地址；cheak_num(*(p+i));给函数传递一个整型值  敢问楼主，你用的是什么编译器，这都能通过

user: user-0
content: 你好，在你提示下，我的输入可以正常，但是vc弹出对话框   DEBUG ERROR damage: after normal block (#48) at 0x007906E6 Press retry to debug  the application   我在网上查了相关关键字，说是我的内存分配小了，那个请你指正下,应该如何分配
user-0 提问: 这段代码 的插入函数 编译没有错误，运行就崩溃。

回复:
user: user-1
content: if(pre = NULL) { p->next = *hp;   //头插 *hp = p; } 改为  if(NULL == pre ) { p->next = *hp;   //头插 *hp = p; }  将常量放前面可以避免你这种漏写=的情况。
user-0 提问: 最后一个函数，输出值为什么是0  如图

回复:
user: user-0
content: 引用 2 楼 Evankaka 的回复:max (a,m1,c,b);//函数调用 这里你使用的是形参，在C++里头，形参改变，实参是不会发生改变的、 直接使用max (a,&m1,&c,&b);要不就地指针来做 引用 2 楼 Evankaka 的回复:max (a,m1,c,b);//函数调用 这里你使用的是形参，在C++里头，形参改变，实参是不会发生改变的、 直接使用max (a,&m1,&c,&b);要不就地指针来做谢谢回复，想请问前面编写的函数也是用了这个思路的，但是输出的值都是有效的，是因为形参里面定义的数组，代表的是数组的首地址，所以实参是数组的话，就能够让形参的值发生改变还返回给实参了吗？

user: user-0
content: 引用 1 楼 ant2012 的回复:楼主，我看你的代码，你好像不太理解数组伟参的问题 void max(float a1[10][5],float m,int i1,int j1) float a1[10][5] 后面的5是没必要的，只有前面的5有用，数组实现的底层还是通过地址偏移实现了，形参的数组并不会开辟数组空间，而只是承接实参的地址，在通过下标值和第一维的大小（也就是10来定位某个元素的位置），如a1[i][j] 其实就是*（a1 + i * 10 + j）。  其次，参数传递，如 void max(float a1[10][5],float m,int i1,int j1)  在调用这种函数时，像m, i1, j1变量，实参只会将值传给形参，但形参和实参都有自己的内存空间，子函数中对m, i1, j1变量的更改并不会同步到实参中。如果想让形参的值和实参同步，就得让它们指向一个内存单元，要么用引用，要么用指针  解决办法（采用引用） void max(float a1[10][5],float m,int i1,int j1); 改成 void max(float a1[10][5],float& m,int& i1,int& j1);抱歉，初学者，自己看书，对细节都不太懂，想请教下，引用该怎么理解？

user: user-1
content: max (a,m1,c,b);//函数调用 这里你使用的是形参，在C++里头，形参改变，实参是不会发生改变的、 直接使用max (a,&m1,&c,&b);要不就地指针来做

user: user-0
content: 仔细看了一遍书上，发现看的不认真，谢谢了

user: user-2
content: 楼主，我看你的代码，你好像不太理解数组伟参的问题 void max(float a1[10][5],float m,int i1,int j1) float a1[10][5] 后面的5是没必要的，只有前面的5有用，数组实现的底层还是通过地址偏移实现了，形参的数组并不会开辟数组空间，而只是承接实参的地址，在通过下标值和第一维的大小（也就是10来定位某个元素的位置），如a1[i][j] 其实就是*（a1 + i * 10 + j）。  其次，参数传递，如 void max(float a1[10][5],float m,int i1,int j1)  在调用这种函数时，像m, i1, j1变量，实参只会将值传给形参，但形参和实参都有自己的内存空间，子函数中对m, i1, j1变量的更改并不会同步到实参中。如果想让形参的值和实参同步，就得让它们指向一个内存单元，要么用引用，要么用指针  解决办法（采用引用） void max(float a1[10][5],float m,int i1,int j1); 改成 void max(float a1[10][5],float& m,int& i1,int& j1);
user-0 提问: 关于指针的调用

回复:
user: user-1
content: 没见过字符的copy函数，如果是复制可以使用memcpy或者strcpy  *ip[i]  是ip这个数组里的第i个元素的第一个字符，不知楼主是不是要表达这个意思

user: user-2
content: 出现 error C2228: left of '.……' must have class/struct/union type的情况有两种。 1：函数名写错了。 2：类似于 bool RemoveConditionData(int tier, char condition, string value) {     return tableBody.RemoveConditionData(tier, condition, value); } 此时会出现error C2065: 'tableBody' : undeclared identifier left of '.RemoveConditionData' must have class/struct/union type 原因是tableBody是定义出的一个类对象，不是new创建的类对象。（在相同情况下）假如返回类型是void 不会出现类似的错误。而且，这种情况只会在bool的返回类型中出现，其他类型，还没有发现

user: user-3
content: 楼主，实现拷贝数据功能，可能用库函数memcpy  void *memcpy( void *dest, const void *src, size_t count );  dest  New buffer  src  Buffer to copy from  count  Number of characters to copy  不过，首先你得给dest和src实参指针开辟空间  如 char *src = "sdfsdfsds"; char *dest = new char[20]; memcpy(dest, src, strlen(src));

user: user-0
content: 我是用C++写的，使用的头文件是include<iostream>include<string> 目的是实现(*ip[i]).copy(*tmpIp[j],1,j);

user: user-3
content: 楼主想做什么，首先，你没有为指针数组中的每个指针元素开辟空间，第二，copy函数从何而来，char类型是普通类型，并没有copy成员函数
user-0 提问: 求助，codeblocks下指针地址怎么会突变？

回复:
user: user-0
content: 弄明白了，是*temp未初始化，所分配的内存单元指向了指针变量p2，即*temp=p2，因而当*temp=*p1执行时，也有p2=*p1，所以才会突变

user: user-1
content: 引用 4 楼 sholber 的回复:void swap (int * p1, int * p2) {     int * temp = p1;     p1 = p2;     p2 = temp; }  [quote=引用 2 楼 UONK1 的回复:] [quote=引用 1 楼 sholber 的回复:] 是你不懂指针，关c::B何事 那程序有什么问题呢？[/quote][/quote]  能发现上面的问题不？？ 要想与别人不同， 还要正确，唯有如此了： void swap(int * p1, int * p2) {     int * temp = & (int)  {* p1};     * p1 = * p2;     * p2 = * temp; }

user: user-1
content: void swap (int * p1, int * p2) {     int * temp = p1;     p1 = p2;     p2 = temp; } 引用 2 楼 UONK1 的回复:[quote=引用 1 楼 sholber 的回复:] 是你不懂指针，关c::B何事 那程序有什么问题呢？[/quote]

user: user-2
content: temp未初始化。  void swap(int *p1, int *p2) {     int temp;     temp = *p1;     *p1 = *p2;     *p2 = temp; }

user: user-0
content: 引用 1 楼 sholber 的回复:是你不懂指针，关c::B何事 那程序有什么问题呢？

user: user-1
content: 是你不懂指针，关c::B何事
user-0 提问: 请 高神帮忙解析下

回复:
user: user-0
content: scanf("c%",&A); 写反了， 是%c不是c%   还是你厉害

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

user: user-2
content: scanf("c%",&A); 写反了， 是%c不是c%

user: user-3
content: scanf("c%",&A); 写反了， 是%c不是c%

user: user-4
content: scanf("%c",&A); 如果不行把%c换成%s试一下， 百度一下使用%s和%c的差别，我忘了

user: user-0
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系  能具体指出代码中的问题吗？
user-0 提问: fprintf实现写到文件行尾字符

回复:
user: user-0
content: 多谢楼上各位回复！  目前这样处理的，写入文件时，加个回车（\n），读取文件时只读取第一行，可以临时解决由2位或3位数变成1位数的问题。

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

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:fopen(file,"rb+")打开 linux下用fopen打开时r+和rb+是一样的，没有区别。 这里是向文件中写入文件行尾标记$，不是普通的字符；

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。 觉得行尾的$符号好像是自动生成？手工写入$不行？

user: user-1
content: fopen(file,"rb+")打开

user: user-1
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-0
content: 引用 1 楼 ubuntu_ai 的回复: 先把文件全部内容读到缓冲区中，然后修改它，最后用fwrite/fputs/fprint把缓冲区写到文件，这样就可以了  如果你直接对文件操作，也是可以的，只是你要处理“文件光标”的问题，每一次读取或者写入光标都会移动。。。。  觉得行尾的$符号好像是自动生成？手工写入$不行？

user: user-2
content: 先把文件全部内容读到缓冲区中，然后修改它，最后用fwrite/fputs/fprint把缓冲区写到文件，这样就可以了  如果你直接对文件操作，也是可以的，只是你要处理“文件光标”的问题，每一次读取或者写入光标都会移动。。。。
user-0 提问: 如何使用scanf为结构变量赋值？

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

user: user-2
content: double 用%lf输入  #include <stdio.h> typedef struct  Goods { 	char  name[18];                   	double  price;                           	char  special;                     	int   num;                      	short   saled;                 }gs;       //typedef   struct  Goods   gs;                  struct  Goods 是结构类型名，gs是变量名  int  main() { 	printf("%d\n", sizeof(gs)); 	gs  gsone = { 0 };    	scanf_s("%s", &gsone.name); 	int n=scanf_s("%lf", &gsone.price); 	printf("成功输入了%d\n", n); 	printf("gsone=%s  %g", gsone.name, gsone.price ); 	return 0; }

user: user-3
content: scanf输入double的格式为%lf printf输出double和float才都是%f

user: user-0
content: #include <stdio.h> typedef struct  Goods{ char  name[18]; double  price; char  special; int   num; short   saled; }gs;       //typedef   struct  Goods   gs;                  struct  Goods 是结构类型名，gs是变量名 int  main() { printf("%d\n", sizeof(gs)); gs  gsone = { 0 }; scanf("%s", &gsone.name); int n=scanf("%f", &gsone.price); printf("成功输入了%d\n", n); printf("gsone=%s  %g", gsone.name, gsone.price ); return 0; } 结果是这样啊，，，求解，

user: user-4
content: 你用是 scanf_s 不是scanf 不要把scanf_s 当成scanf 使用 这是两个不同的函数  自己搜索清楚scanf_s的用法  不要想当然的把scanf的参数抄进去
user-0 提问: c语言：求救。。。为什么会运行错误

回复:
user: user-0
content: 谢谢了，问题解决！

user: user-1
content: char* aa = new char（50）; sprintf（aa,"%S","1234"）; strcat(aa,"123");

user: user-0
content: @user-1 但是我想用字符指针，该怎么做？

user: user-1
content: strcat(d,s) 中 d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。 如下即可： char aa[50]="1234"; strcat(aa,"123");
user-0 提问: 急求各位大神！！！！sim900a连接到51单片机后成功读取短信内容后，如何编程（c语言）可以得到发送该短信的手机号是多少？

回复:
user: user-1
content: 真棒，楼主分享一下

user: user-2
content: 看AT命令手册，读取短信部分。 AT+CMGR能获号码：  看下图

user: user-3
content: http://wenku.baidu.com/view/2a559695daef5ef7ba0d3ca8  你去把这个文档下下来看看，里面附有代码，我本科时用过这个文档
user-0 提问: Linux 操作系统下段错误问题

回复:
user: user-1
content: 有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中

user: user-2
content: 在可疑的地方设置个条件断点试试，例如：条件断点： b test.c:8 if cnt == 5

user: user-3
content: http://www.0xffffff.org/?p=6 可以配合内核转储文件来找

user: user-4
content: 可以通过看内核源码，或者 oops
user-0 提问: C语言循环

回复:
user: user-1
content: TC,BC 中，可以这么做 #include<dos.h> unsigned char far * p = MK_FP(seg,ofs); p+=  rom_size seg  =  FP_SEG(p); offset = FP_OFF(p);

user: user-0
content: 该怎么改呢？知道的请告诉我，谢谢！

user: user-0
content: 究竟该怎么改啊？谢谢！

user: user-1
content: 16Bits 代码，要确保 offset 在同一个64K范围之内 如果超过范围，必须调整段 的值，否则会出现 指针绕回现象 把两个 不同64K内存的读写，变成同一个64K内存的读写，这样读写位置就错了

user: user-1
content: 段seg和 偏移offset 一块调整， 小心段折返错误

user: user-0
content: 不是太明白，这个程序里没0xFFFFL 和 0xFFFFUL

user: user-0
content: 其实跟汇编关系不大，主要读内存的内容

user: user-2
content: 0xFFFF 和 0xFFFFL 和 0xFFFFUL 不是一回事！

user: user-3
content: 自己调试吧，不会汇编
user-0 提问: 问一个多级指针的问题，这个程序报错；

回复:
user: user-0
content: 引用 3 楼 weixin_29956463 的回复:q是int** 引用 1 楼 user-2 的回复:*q 是一个 int*  100是一个 int 你说呢 # include <stdio.h>  void f(int ** q) { 	int a = 100; 	*q = &a; }  void g(void) { 	int i = 10; 	int * p = &i;  	f(&p);  	printf("i = %d\n",i); }  int main(void) { 	g();  	return 0; } 这样写为什么还是改写不了i的值啊？；

user: user-1
content: q是int**

user: user-0
content: 引用 1 楼 user-2 的回复:*q 是一个 int*  100是一个 int 你说呢  原来如此，多谢！

user: user-2
content: *q 是一个 int*  100是一个 int 你说呢
user-0 提问: 求教openat函数的用法

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:man opendir man dirfd 总算等到我要的东西了，第二个函数对我太有用了，十分感谢！

user: user-1
content: man opendir man dirfd

user: user-0
content: 引用 1 楼 user-1 的回复:建议先把第一二章看明白了。  DESCRIPTION        The  openat()  system call operates in exactly the same way as open(2),        except for the differences described in this manual page.         If the pathname given in pathname is relative, then it  is  interpreted        relative  to  the  directory  referred  to by the file descriptor dirfd        (rather than relative to the current working directory of  the  calling        process, as is done by open(2) for a relative pathname).         If  the pathname given in pathname is relative and dirfd is the special        value AT_FDCWD, then pathname is interpreted relative  to  the  current        working directory of the calling process (like open(2)).         If the pathname given in pathname is absolute, then dirfd is ignored. 关键在于第一种情况，这个要给一个dirfd，可是我试了，open函数打不开目录，如果给目录的话，会报“Is a directory”的错。 如果dirfd给的是一个打开的文件描述符，会报无效的文件描述符这个错，所以现在问题是纠结于这个第一种情况下，dirfd如何赋值。这才是重点！而且关键是网上现在搜不到任何相关的例子函数！

user: user-1
content: 建议先把第一二章看明白了。  DESCRIPTION        The  openat()  system call operates in exactly the same way as open(2),        except for the differences described in this manual page.         If the pathname given in pathname is relative, then it  is  interpreted        relative  to  the  directory  referred  to by the file descriptor dirfd        (rather than relative to the current working directory of  the  calling        process, as is done by open(2) for a relative pathname).         If  the pathname given in pathname is relative and dirfd is the special        value AT_FDCWD, then pathname is interpreted relative  to  the  current        working directory of the calling process (like open(2)).         If the pathname given in pathname is absolute, then dirfd is ignored.
user-0 提问: 关键字static的作用是什么

回复:
user: user-1
content: 应该说，static 修饰的变量如果有初始化语句： static int a=1; 该语句只生效一次，下次进入函数，还是其之前被改变的值。 跟你在函数外声明了一个全局变量除了作用域之外没区别。

user: user-2
content: 每天回帖即可获得10分可用分！  1：全局变量前加static      此时与系统默认(未显示添加)的auto自动变量关键字功能背道而驰；如果全局变量被auto修饰，则外部其它文件可用extern访问，如果加了static，为本文件内有效； 2：局部变量前加static      局部变量的存储区将由堆栈内存区移至静态存储区，和全局变量有同等生存期(从定义位置处到程序结束执行)；此时被static修饰的局部变量有局部可见性(在定义处)，会"记忆"访问它之后的最后一个最新的值，并供下次访问使用。  楼主要是觉着解答如意，要给分哟，我盼着挣点积分，都盼到太阳从南边出来了。。

user: user-3
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-4
content: 维持其值不变 不是指 你调用 ++a他值仍然不变，否则这个变量还叫变量吗  维持其值不变  指的是：函数每次执行完的时候这个变量不会销毁，比如某一次执行完后值为10，下一次再调用该函数的时候，他的值仍是10，而你可以用代码改变他的值

user: user-5
content: 静态变量存放在程序的静态区（又称全局区），其生命周期是整个程序， 只不过访问（可见性）受其定义位置的限制，如果定义在函数中，其可见性和一般局部变量没有区别，只不过，在函数执行结束其内存不会被销毁；如果定义在类中，其可见性属于整个类，而不是具体某个实例化对象，也就是类的所有对象共享这个变量；如果在模块外（即所谓的静态全局变量），其可见性在整个文件。 总之，静态变量在访问时，其值可以被改变，但不会随着模块的退出而释放，只要程序没有结束，它就会一直在内存中

user: user-6
content: 在函数体，一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 这里的说法是对的。 void fun(){ static int a=1; //改为int a=1比较下 printf("%d\n",a);  ++a; } 这里如果 没有++a。a确实一直是不变的。 可以这样认为，静态变量只会初始化一次。所以以后每次调用都在原来的基础a上来++

user: user-7
content: 看到这么多大神回复.我只纯顶顶吧.

user: user-8
content: 因为历史的原因，C中的一些东西在术语的使用上乱得很，实在看不下去。  1)在函数体，一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 --->>>真实的情况是，在函数体内用存储类指定符static声明的标识符是无链接的，它所指示的对象具有静态存储期，在程序启动时创建（并初始化为0），而且仅具有块作用域，所以只能在函数体内的某些部分可见（或者使用）。 2) 在模块内（但在函数体外），一个被声明为静态的变量可以被模块内所用函数访问，但不能被模块外其它函数访问。它是一个本地的全局变量。 －－－>>>问题在于，函数参数列表不是函数体，难道参数也是静态的？再说，因为作用域的关系，它也未必能被当前模块内的函数访问： void f (int x)  {      a = 1;     //可以？？ } int main (void) {      f (a);     //可以？？ } static int a; 3) 在模块内，一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是，这个函数被限制在声明它的模块的本地范围内使用。 ==>>>>>竟然有静态函数？闻所未闻。static作用于函数，我们说此函数是“具有内部链接属性”的。  最后，光这3条还总结得不够。比如， void f (int a[static 3]); 这里的static又是什么意思涅？

user: user-9
content: 如果去掉static，每次执行函数都会是全新的局部变量，输出结婚始终是1;如果加了static，变量会在每次调用函数时继承下去，而且只进行第一次初始化为1,之后会累加

user: user-10
content: 这个说法是错的  局部 static 变量 只保证函数调用完毕不会销毁 至于变量的值 就不是 static 能管得着的了
user-0 提问: C语言中sizeof( )能不能测一个确切的double数的位数，例如sizeof（3.1415）

回复:
user: user-1
content: 8个字节，double

user: user-2
content: 引用 15 楼 SXJIAKE 的回复:#define charsize(a) (sizeof(#a) - 1) 则 charsize(3.14) = 4

user: user-3
content: #define charsize(a) (sizeof(#a) - 1) 则 charsize(3.14) = 4

user: user-4
content: 不可以，因为浮点数是不精确的。

user: user-5
content: 自己写函数实现吧

user: user-6
content: 常量也有类型

user: user-7
content: 引用 2 楼 wanghaha_ 的回复:那该怎样求一个确切数的位数呢？？求解答  如果真想返回位数，可以将double转成字符串，判断字符串在小数点后的长度

user: user-8
content: double a=3.0f; sizeof（a）; lz期望返回值为几？？ double a=3.000000f ; sizeof（a）; lz期望返回值为几？？ double a=.3f; sizeof（a）; lz期望返回值为几？？  unsigned __int64 na = 0x4008000000000000; double a = *((double*)&na);  sizeof（a）; lz期望返回值为几？？

user: user-9
content: 小数点后面是没有数值的情况下全是0吧

user: user-10
content: 不能吧，浮点数本来就不是精确数值

user: user-6
content: http://bbs.csdn.net/topics/390676437

user: user-11
content: 可以这么做。将double转换成String,然后判断string和长度、小数符号等

user: user-0
content: 奥，     谢谢你

user: user-12
content: 引用 2 楼 wanghaha_ 的回复:那该怎样求一个确切数的位数呢？？求解答没有现成的函数，但可以自己写算法去实现。

user: user-13
content: 引用 2 楼 wanghaha_ 的回复:那该怎样求一个确切数的位数呢？？求解答 不能。也无意义。几乎所有的double都不准确

user: user-0
content: 那该怎样求一个确切数的位数呢？？求解答

user: user-12
content: double型占8字节，不管里面实际记录的是什么数。
user-0 提问: c语言  新手求解答

回复:
user: user-0
content: 啊  谢谢两位 是我忽略了  汗~

user: user-1
content: 一个是double，一个是float，损失了精度，所以就不一样了。

user: user-2
content: .........都变成double就一样了
user-0 提问: 关于BORLANDC编译问题

回复:
user: user-1
content: 按F7单步调试。

user: user-0
content: 引用 1 楼 user-4 的回复:没问题啊 接下来应该是link了吧 我自己搞错了。。太长时间不用 快捷键按错了。可是为什么compile会出现错误，而run就可以成功呢？ compile和run的区别在哪里

user: user-2
content: press any key 退出这个界面 press Alt +R 运行观察结果

user: user-3
content: 看前面写success，应该没问题，你看看这一步有没有生成什么。

user: user-4
content: 没问题啊 接下来应该是link了吧
user-0 提问: 如何编写一个post的日志，记录http协议中post发送的信息的

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:把暂时不能发送成功的数据保存到数据库，或者文件中 啊，这个我明白，把记录存到txt就可以，但是我是学嵌入式的，对网页完全不懂，不知道怎么实现日志功能

user: user-1
content: 把暂时不能发送成功的数据保存到数据库，或者文件中
user-0 提问: 计算机网络和数据库看哪本书好？

回复:
user: user-1
content: 还在用vc6.0，真是执着。《unix网络编程(第一卷)》《tcp/ip详解(第一卷)》，vc的数据库没什么经典书，随便找本看看就行。

user: user-2
content: 计算机网络： 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545  数据库： 通览SQL Server中文版联机帮助

user: user-2
content: 使用VC6  偶遇到莫名其妙的编译错误都是用 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 和 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。  偶遇到莫名其妙的链接错误都是用 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 的方法解决的。

user: user-0
content: Vs2010呢？
user-0 提问: 请问下gtk的一些问题

回复:
user: user-1
content: 引用 6 楼 king_2007 的回复:[quote=引用 5 楼 zhaowech 的回复:] 1.c语言写gui程序用什么东西并没有必然的限定，这和操作系统有关，linux下用gtk+和qt比较流行 2.gtk是c写的，可移植性好，但是是面向对象的，通过使用宏来实现继承和多态，面向对象不等于c++，并且谁也不包含谁 3.我了解的范围内没都是gtk+，并没有gtk，你也不用纠结，直接用gtk+就好了 4.gtk+编写界面程序在linux下用得多，具体需要你自己摸索了，不是几句话能说清的，路已经明确了 5.同4 那我对c++不了解，如果用单纯的c语言编写windows应用程序，使用gtk库相对于gtk+来说比较容易些，如果用gtk+我想使用它的库会比较困难吧？。请问如何安装gtk库，现在的gtk库版本是多少？如何安装呢？[/quote] 去gtk官方网站，看它的说明，关键字“get start”

user: user-0
content: 引用 5 楼 zhaowech 的回复:1.c语言写gui程序用什么东西并没有必然的限定，这和操作系统有关，linux下用gtk+和qt比较流行 2.gtk是c写的，可移植性好，但是是面向对象的，通过使用宏来实现继承和多态，面向对象不等于c++，并且谁也不包含谁 3.我了解的范围内没都是gtk+，并没有gtk，你也不用纠结，直接用gtk+就好了 4.gtk+编写界面程序在linux下用得多，具体需要你自己摸索了，不是几句话能说清的，路已经明确了 5.同4 那我对c++不了解，如果用单纯的c语言编写windows应用程序，使用gtk库相对于gtk+来说比较容易些，如果用gtk+我想使用它的库会比较困难吧？。请问如何安装gtk库，现在的gtk库版本是多少？如何安装呢？

user: user-1
content: 1.c语言写gui程序用什么东西并没有必然的限定，这和操作系统有关，linux下用gtk+和qt比较流行 2.gtk是c写的，可移植性好，但是是面向对象的，通过使用宏来实现继承和多态，面向对象不等于c++，并且谁也不包含谁 3.我了解的范围内没都是gtk+，并没有gtk，你也不用纠结，直接用gtk+就好了 4.gtk+编写界面程序在linux下用得多，具体需要你自己摸索了，不是几句话能说清的，路已经明确了 5.同4

user: user-2
content: 好像一个是c用的一个是python用的

user: user-0
content: ...........?????等待，高手的解答

user: user-3
content: blog.csdn.net/mydo

user: user-3
content: 参考本猫csdn的blog
user-0 提问: 求大神解答问题  算法向 分类与组合

回复:
user: user-1
content: IPV4 有四类地址，按照地址范围分类就可以了 至于 IPV6 还是查查文档吧

user: user-2
content: 排序， mask从小到大， mask相同的ip从小到大

user: user-3
content: map

user: user-4
content: 先排序，再提出
user-0 提问: C语言，刚刚学到malloc，有很大的疑问；

回复:
user: user-0
content: 引用 6 楼 lc316546079 的回复:～～你不强转试试咯，不一定要强转，有的平台是不会报错的，报错才需要显示的强转 引用 7 楼 paschen 的回复:malloc只是分配需要大小的空间，这空间你可以用于任何类型，分配出来是void*类型，所以需要转成int*  谢谢，我已经明白了！；

user: user-1
content: malloc只是分配需要大小的空间，这空间你可以用于任何类型，分配出来是void*类型，所以需要转成int*

user: user-2
content: ～～你不强转试试咯，不一定要强转，有的平台是不会报错的，报错才需要显示的强转

user: user-0
content: 引用 2 楼 baijiaheizhiganmao 的回复:[quote=引用 1 楼 user-5 的回复:] man一下malloc，可以看到malloc的返回值类型为（void*)，所以要进行类型转化 一楼的说法是对的。但是1楼应该不用说man一下（可能引起新的疑惑），因为要考虑到楼主使用的是Windows系统。此时楼主应该去百度一下malloc的函数原型。就能验证一楼的说法是正确的。[/quote]  多谢，多谢；

user: user-0
content: 多谢诸位详解！

user: user-3
content: c语言可以不用强制转换，但c++必须

user: user-4
content: 引用 1 楼 user-5 的回复:man一下malloc，可以看到malloc的返回值类型为（void*)，所以要进行类型转化 一楼的说法是对的。但是1楼应该不用说man一下（可能引起新的疑惑），因为要考虑到楼主使用的是Windows系统。此时楼主应该去百度一下malloc的函数原型。就能验证一楼的说法是正确的。

user: user-5
content: man一下malloc，可以看到malloc的返回值类型为（void*)，所以要进行类型转化
user-0 提问: 如何实现不在双击消息里面存储文件，改为每隔一段时间自动存储文件。代码贴在下面，求大神解决啊　

回复:
user: user-0
content: 很感激楼上的你们（jack960330；忘世麒麟）如此热心给予的解答，特别感谢西伯利亚冰给我修改了代码，我把它贴上去。 void CClient_FileTransferDlg::Download() {     int nCount = m_ListFile.GetItemCount();     for (int i = 0; i < nCount; i++)     {         int iSel = i;          CString strFileName = m_ListFile.GetItemText(iSel, 0);         CString str2;         str2.Format("D:\\zhao.txt");         //得到客户端保存路径         CFile file;         BOOL bOpen = file.Open(str2, CFile::modeCreate|CFile::modeWrite, NULL);          if(!bOpen)         {             MessageBox("文件创建或打开失败！请确认路径再重试！");             continue;         }         file.Close();          MSGREQUEST msgRequest;//通信语言结构体         msgRequest.iCommand = FILEDATA;         msgRequest.lFileLength = m_ListFile.GetItemData(iSel);         msgRequest.lFileOffset = 0;         strcpy(msgRequest.sClientPath, str2.GetBuffer(0));         strcpy(msgRequest.sServerPath, m_ListFile.GetItemText(iSel, 5));          //子项目，第6列          DWORD dwStartTick = GetTickCount();         char sStartTick[20];         sprintf(sStartTick, "%u", dwStartTick);         //格式：Unsigned decimal integer         m_ListFile.SetItemText(iSel, 6, sStartTick);          m_pClient->RequestFile(msgRequest);//调用请求线程     }      SetTimer(TIMER_ID_SAVE, 4000, NULL); }

user: user-1
content: 你接收实际就是下载，只要把路径定死，自动接收就行了

user: user-2
content: 发你了      。

user: user-3
content: 引用 3 楼 zhao1209 的回复:谢谢楼上的回复，移动上面那段程序到timer消息里，我试过了，因为涉及到线程以及结构体的问题，所以我一直没有解决掉，您能否下载我的代码帮我看看，谢谢您啦 自己写个小程序测试一下该控件的用法,然后将代码加到模块中去.你始终也要学会这个非常常用的控件啊,为什么不在这一次学会尼?

user: user-0
content: 谢谢楼上的回复，移动上面那段程序到timer消息里，我试过了，因为涉及到线程以及结构体的问题，所以我一直没有解决掉，您能否下载我的代码帮我看看，谢谢您啦

user: user-3
content: 你注册一个timer时间 -——>你注册一个timer事件

user: user-3
content: 你注册一个timer时间，当时间到了的时候触发一个存储文件操作。 你百度一下“MFC timer”这两个关键字。不会太难的。
user-0 提问: 关于结构体数组循环问题  忘大神解决下！3Q

回复:
user: user-0
content: 谢谢各位大神了  问题解决了

user: user-1
content: 引用 5 楼 q3733353520 的回复: getchar(); //把这句放到for循环的最后，也就是scanf("%s",Family[i].mother);的后面  另外最好这样  People Family[COUNT] = {0};//最好这样，然后定义个j用来计算你输入的人数，在第二个for循环中使用

user: user-1
content: getchar(); //把这句放到for循环的最后，也就是scanf("%s",Family[i].mother);的后面

user: user-2
content: 字符串比较改为strcmp()试试

user: user-0
content: #include <stdio.h>   2 #include <ctype.h>   3 #define COUNT 50   4    5 typedef struct People People;   6 struct People   7 {   8     int age;   9     int high;  10     char name[20];  11     char father[20];  12     char mother[20];  13 };  14   15 int main()  16 {  17     People Family[COUNT];  18     int i;  19     char a = '\0';  20     for(i = 0; i < sizeof(Family)/sizeof(People); ++i)  21     {  22         printf("if stop this enter,please enter n or N!,if continue, enter y     or Y");  23         scanf("%c",&a);  24         getchar();  25         if(tolower(a) == 110)  26         {  27             break;  28         }  29         printf("enter name: ");  30         scanf("%s",Family[i].name);  31   32         printf("enter age: ");  33         scanf("%d",&Family[i].age);  34   35         printf("enter high: ");  36         scanf("%d",&Family[i].high);  37   38   39         printf("enter father: ");  40         scanf("%s",Family[i].father);  41   42   43         printf("enter mother: ");  44         scanf("%s",Family[i].mother);  45     }  46   47     for(i = 0; i < sizeof(Family)/sizeof(People); ++i)  48     {  49         printf("%s is %d years old, %d high, and has %s is %s father, %s is %    s mother\n ",Family[i].name,Family[i].age,Family[i].high,Family[i].father,Fam    ily[i].name,Family[i].mother,Family[i].name);  50     }  51   52     return 0;  53 } 程序我改了，主要问题在按下enter键，出现了垃圾字符。。 但是 输入 n 也不跳出循环 怎么回事？

user: user-3
content: 手机看着好乱啊

user: user-0
content: 问题主要在第一个人for循环哪里   ~~~
user-0 提问: OPENMP并行程序，并行之后与串行耗时总是差不多

回复:
user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！
user-0 提问: 两个小程序输出结果不同的原因是什么？

回复:
user: user-1
content: 第一个printf返回的是函数局部变量的地址，函数局部变量的生存周期在函数返回时结束，因此，当函数结束时，函数内局部变量中的值是不可信的（就是说可能还是原值，也可能已经变成了未知的值）  第二个没问题

user: user-2
content: 面试遇到过，哈哈

user: user-3
content: 第一个"hello world"是字符数组局部变量，第二个则指向常量区（不变），而局部的在函数结束后就销毁了

user: user-4
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-5
content: 第一个是标准的返回 自动变量地址的问题  返回自动数组名  其实就是返回数组第一个元素地址. 这个地址对应的内存，在函数返回后，被系统回收，不再是可以自由访问的了，结果未定义。  第二个 返回 字符串字面值 本身没有问题 不过 字符串字面值 是个常量，其中每个字符，都是不能修改的  它不应该 是 char *类型的，而应该是 const  char *类型的。 所以函数返回类型是错误的。 因为，这个数据是不能修改的。

user: user-6
content: 第二个程序 定义的char*pcStr="hello world"; hello world 是放在常量区的，指针相当于野指针；

user: user-7
content: 第一个是错误的，使用了 野指针 char acStr[]="hello world";      数组后面没有自动加‘\0’, 字符串会一直往后读直到读到‘\0’结束，但数组出了函数就自动释放了，再使用是错误的用法  第二个 是对一个常字符串 读， 常量字符串在程序结束才会清除，同时，字符串后面会自动加一个‘\0’

user: user-8
content: 第一个返回的是局部数组的首地址，局部数组跟任何局部变量一样，随着函数的调用在栈上分配。 执行到数组定义那一句时，这个局部数组是用存储在常量区的一个字符串来初始化，也就是把那个常量字符串的内容拷贝到这个局部数组里来了。 尽管如此，可函数返回后局部变量的地址不再有效，所以程序1是有问题的。 还要注意数组名在C程序中基本上就是表示地址，数组所占内存的首地址。  第二个是在函数内部定义了一个指针变量，这个指针直接指向了常量区一个字符串的首地址，然后函数返回这个指针变量（而不是这个变量的地址），也就相当于返回了常量区那个字符串的地址。 常量区是静态的，不会随着函数的调用和返回产生什么变化，所以这个程序没啥问题。
user-0 提问: 做一个超市的管理系统

回复:
user: user-1
content: 没那么夸张。一步一步实现，先想想大致，然后有什么功能不对自己再加。学会重构

user: user-2
content: 数据库，表结构，存储结构，设计架构，操作流程

user: user-3
content: 先说说你要做成什么样的？什么程度的？不然太宽泛了。没有重点是大忌

user: user-4
content: 设计给出来（要解决什么问题，解决这些问题需要做哪些事，分模块的话，有哪些模块，每个模块的输入是什么，输出什么，理清各个模块之间的关系，用什么方式实现等），再用语言实现，语言只是工具，只要会用及熟练程度，C语言也可以做面向对象的东西

user: user-5
content: 如果你只会c语言，说实话，做一个超市管理系统还是有难度的，并不是说你需要掌握别的语言，而是说你欠缺设计系统的能力～～～～～  做一个系统，首先要形成精准的需求分析，然后进行分布式系统的设计，然后根据设计去模块化地实现～～～  技术层面上，会用到编程语言（比如你用c语言），还有模块之间交互信息的库（类似socket），还要用到数据库～～～   所以如果你只会c语言，要做这样一个系统是有难度的，除非你肯花时间，去一点点搞定～～

user: user-6
content: 超市的管理系统 主要抓住2点： 1 列出主要功能模块，实现之 2 保存数据的方式，如使用文件或者数据库保存超市管理的数据。

user: user-7
content: 管理信息系统的重点不是用什么语言，而是流程
user-0 提问: Python调用C的共享库，如何调试调用的共享库

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-1
content: 用gdb调试。
user-0 提问: 哪位大神能帮编写个程序啊！！！c或c++

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> #include <stdlib.h> #include <locale.h> const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int calc(char *expr,char **addr) {     int ST[10]={0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*pp;     int ist=1,iop=1,last;     char cc;      pp=expr;     last = !DIGIT;     if ((c=*pp)=='!') {         op[0] = c;         pp++;     }     while (1) {         c=*pp;         if (c==0) break;         if (c=='(') {             ST[ist++]=calc(++pp,addr);             pp = *addr;             last = DIGIT;         } else if (c==')') {             pp++;             break;         } else if (c=='+'||c=='*') {             if (last != DIGIT) {                 printf("运算符粘连\n");exit(5);             }             pp++;             if (c=='+') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] |= ST[ist];break;                     case '*':  ST[ist-1] &= ST[ist];break;                     case '!':  ST[ist-1] =1-ST[ist];break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*') {                 cc = op[iop-1];                 if (cc=='+') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] &= ST[ist];break;                     case '!':  ST[ist-1] =1-ST[ist];break;                     }                 }             }             last = !DIGIT;         } else if (c=='!') {             op[iop++] = c;             ST[ist++] =0;             pp++;         } else {             if (last == DIGIT) {                 printf("两数字粘连\n");exit(7);             }             if (!(pp[0]=='0'||pp[0]=='1')) {                 printf("非法字符\n");exit(8);             }             ST[ist++]=pp[0]-'0';             pp++;             last = DIGIT;         }     }     *addr=pp;     if (iop>=ist) {         printf("表达式有误\n");exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] |= ST[ist];break;         case '*':  ST[ist-1] &= ST[ist];break;         case '!':  ST[ist-1] =1-ST[ist];break;         }     }     return ST[0]; } int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入布尔表达式，比如!(1+1)*1：");fflush(stdout);         rewind(stdin);         gets(s);         if (s[0]==0) break;//         printf("%d\n",calc(s,&endss));     }     return 0; }

user: user-1
content: 参考Tiny C Compiler源代码。
user-0 提问: 如何动态获取汇编语言指令的机器码

回复:
user: user-1
content: 这个最好用反汇编器来做。 网上有很多开源的反汇编器，其中的反汇编行为还可以通过选项参数来定制。 可以参考一下本猫的blog。

user: user-2
content: 再这句汇编前面搞个地址比如:      int a=0;     __asm ("mov %eax,%ebx");     int* p = &a;     p++;     void* asmP = p;  asmP就是你要的地址

user: user-0
content: 谢谢回答。很有效
user-0 提问: 深入c语言宏

回复:
user: user-1
content: 引用 5 楼 u011493488 的回复:[quote=引用 2 楼 baijiaheizhiganmao 的回复:] 这可没有深入.宏展开仅仅是做了一次替换而已.展开的过程中你用来替换apps的变量是经过声明的,否则一样报错. 我全局搜索了apps没经过申明，只是一个标示而已[/quote] 可能我说的不是非常清楚,我的意思是这样的: #define ADD(x,y) (x+y) .... void show(int a,int b){ cout<<ADD(a,b)<<endl; } 你看你的x,y有什么意义嘛?没有,他们仅仅是为将来替换a b做准备而已.在上面的例子中,x y都是没有声明的,但是你做替换的a b 是在其他地方声明过的. 回到你的apps,因为你是在使用宏的过程中传入的,所以你的程序中肯定有地方声明了apps,不然通不过编译器的.

user: user-0
content: 引用 1 楼 user-4 的回复:宏在语法处理前, 它本来就不知道有声明这回事. 带括号就称为象函数一样的宏 那apps要制定类型吗？当我没有在使用apps时候，应该不会报错吧，

user: user-0
content: 引用 2 楼 baijiaheizhiganmao 的回复:这可没有深入.宏展开仅仅是做了一次替换而已.展开的过程中你用来替换apps的变量是经过声明的,否则一样报错. 我全局搜索了apps没经过申明，只是一个标示而已

user: user-2
content: VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-3
content: 你的程序在其他地方有定义 apps 。 很多这个名字的变量，几乎都是系统定义的。

user: user-1
content: 这可没有深入.宏展开仅仅是做了一次替换而已.展开的过程中你用来替换apps的变量是经过声明的,否则一样报错.

user: user-4
content: 宏在语法处理前, 它本来就不知道有声明这回事. 带括号就称为象函数一样的宏
user-0 提问: 求大神

回复:
user: user-0
content: 这都是文章，没有程序代码，只需程序代码

user: user-1
content: https://www.baidu.com/s?wd=%E5%9F%BA%E4%BA%8E%E6%A8%A1%E6%8B%9F%E9%80%80%E7%81%AB%E7%AE%97%E6%B3%95%E7%9A%84BP%E7%AE%97%E6%B3%95%E7%A8%8B%E5%BA%8F&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1
user-0 提问: 怎么通过标准I/O技术而不是命令行参数来获取文件名？

回复:
user: user-1
content: //赋值文本文件 #include <stdio.h> int main(void) { 	FILE *fi, *fo; 	fi = fopen("1.txt", "rb"); 	fo = fopen("2.txt", "wb"); 	char buf[128]; 	while (1) 	{ 		if (NULL == fgets(buf, sizeof(buf), fi)) break; 		fprintf(fo, "%s", buf); 	} 	fclose(fi); 	fclose(fo); 	return 0; }

user: user-2
content: #include <stdio.h> #include <string.h>  #ifndef PATH_MAX #define PATH_MAX    255 #endif  char * strchop(char *s) {     size_t len;      if (s) {         len = strlen(s);         if (len > 0 && ('\n' == s[len - 1] || '\r' == s[len - 1]))             s[len - 1] = '\0';         len--;         if (len > 0 && ('\n' == s[len - 1] || '\r' == s[len - 1]))             s[len - 1] = '\0';     }     return s; }  int main(int argc, char *argv[]) {     char source[PATH_MAX] = {0};     char target[PATH_MAX] = {0};      if (1 == argc) {         /* 通过标准 I/O 获取文件名 */         printf("source: ");         strchop(fgets(source, sizeof(source), stdin));         printf("target: ");         strchop(fgets(target, sizeof(target), stdin));     } else {         /* 通过命令行参数获取文件名 */         strcpy(source, argv[1]);         strcpy(target, argv[2]);     }      printf("source=[%s]\n", source);     printf("target=[%s]\n", target);      return 0; }

user: user-3
content: Again, it is a simple matter to modify this program to use standard I/O techniques instead of command-line arguments to provide filenames. 粗略地翻译一下，就是让你修改程序，使用标准I/O（技术）来提供文件名，而不是用命令行参数来提供文件名。  所谓的标准I/O，就是scanf这些东西了。  使用命令行提供文件名运行起来是这样的： process.exe foo.txt 对于int main(int argc, char * argv[])来说，argv[1]即为"foo.txt"  使用I/O，运行起来就是这样： cmd> process.exe please input the file you want to process: foo.txt ... 所以代码中大概会有这样的语句： char filename[80]; printf("please input the file you want to process: "); scanf("%s", filename); process(filename): ...  所以说，英语也是一种语言。

user: user-0
content: 谢谢了  各位

user: user-0
content: 引用 2 楼 user-4 的回复:获取什么文件名？运行此程序的文件名？  就一个简单的小程序 把一个文件中的内容复制到另一个文件中

user: user-4
content: 获取什么文件名？运行此程序的文件名？

user: user-0
content: 人呢
user-0 提问: 一个我觉得很奇怪的C语言问题 求高手解答

回复:
user: user-0
content: 引用 15 楼 mymtom 的回复:[quote=引用 14 楼 SCP_0000 的回复:] 唉 还是不怎么明白 看来还是得研究下底层的东西... 这个不是什么底层的东西啊，就是一个规范： 函数调用前要声明[/quote] 好吧 我还得努力学习呀 你的回答最靠谱分就给你吧  其他的各位不好意思了

user: user-1
content: 引用 14 楼 SCP_0000 的回复:唉 还是不怎么明白 看来还是得研究下底层的东西... 这个不是什么底层的东西啊，就是一个规范： 函数调用前要声明

user: user-0
content: 唉 还是不怎么明白 看来还是得研究下底层的东西...

user: user-2
content: 我也不知道，pi反正不是3.1414，建议多试几次。

user: user-1
content: 引用 6 楼 wbx779139218 的回复:编译器处理浮点数的模块是被"动态"加载的，也就是说，如果你没有显式地定义一个变量(只是声明)，那么这个处理浮点数的模块就可能不被编译器加载，从而不能正确的处理浮点数。  例如: float a;                 //编译器可能没有加载模块 float b = 1.0f;      //编译器加载模块 float c = 1;           //不知编译器是否加载模块  我的猜测是：math.h头文件中显式使用浮点数定义，所以编译器加载了浮点数处理模块(在模块加载后，编译器可以正确处理后续的浮点数) 我的建议:去掉math.h头文件后在你的porc函数中浮点类型变量使用显式定义,例如float n=0.0f,t,pi;并且将浮点定义放到函数作用域的最前端试试  个人意见，仅供参考 这个纯粹是主观臆测了，根本就没有这回事。 真实的情况是fabs的原型是double fabs(double x); 如果没有 #include <math.h> 对于fabs(t)这个函数调用有些编译器会假定fabs的原型是int fabs(float); 也就是所谓的隐式声明； 而有的编译器会警告，更严格的编译器会报错。  在楼主的例子里，#include <math.h> 的作用就是为fabs提供函数原型， 自己写个声明也有同样的作用 double fabs(double x);  当然，推荐的方法是包含头文件。

user: user-3
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-4
content: 楼主，是这样的，我告诉你，c如果没有函数的完整声明，编译器是有可能对函数的声明形式进行猜测 猜测的声明形式是 int func()，表示int返回值，参数不确定 这个声明形式是不准确的 所以有可能出现这个问题，我们不能依赖编译器的声明猜测，所以，千万要记住写声明（如果没有声明猜测就报错啦）

user: user-5
content: vs2013编译不包括math头文件 变异不过 gcc有没有math头文件结果都是3.1414

user: user-3

user: user-0
content: 不好意思 忘了说了 编译环境是VC 6  我按6L所说换了显式定义 结果也一样 按7L所说看了一下fabs(t)的返回值 一直为4991.00 那它为何会退出循环 而且在n=15，t=-0.0666667时退出。

user: user-6
content: LZ可以说说环境，如果是VC6的话，多半就是这个问题了，6L类似见解。

user: user-6
content: 没有加math.h有可能导致没有初始化浮点运算

user: user-7
content: 问题出在 fabs函数这里，你不把声明这个函数的头文件包括进来，编译器就默认这个函数的返回值类型为int 的。这样你调用它返回得到的将是一个不确定的值。我试了一下我的fabs（f）f为任意浮点数，结果都得到4991。   建议LZ 用个变量保存fabs的值然后单步运行对比一下 fabs(t) 和 t  是否满足绝对值相等。

user: user-8
content: 编译器处理浮点数的模块是被"动态"加载的，也就是说，如果你没有显式地定义一个变量(只是声明)，那么这个处理浮点数的模块就可能不被编译器加载，从而不能正确的处理浮点数。  例如: float a;                 //编译器可能没有加载模块 float b = 1.0f;      //编译器加载模块 float c = 1;           //不知编译器是否加载模块  我的猜测是：math.h头文件中显式使用浮点数定义，所以编译器加载了浮点数处理模块(在模块加载后，编译器可以正确处理后续的浮点数) 我的建议:去掉math.h头文件后在你的porc函数中浮点类型变量使用显式定义,例如float n=0.0f,t,pi;并且将浮点定义放到函数作用域的最前端试试  个人意见，仅供参考

user: user-0
content: 我调试了一下 发现当n=15.0000，t=-0.0666667时退出了循环，前面还是没问题的，为什么会这样呢？

user: user-9
content: 浮点不是实数，是对实数的一种近似模拟， 这个求PI的方法对于实数成立，不过对浮点就不成立了，因为有误差的积累
user-0 提问: 一段c程序

回复:
user: user-1
content: 引用 10 楼 char_c 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End. 第二次扫描数组的时候，p指针应该是指向s[3]的吧，空格，那v应该度不到值才对啊，怎么还会是123呢？既然k==0了，不就代表没有存储到东西？不懂啊，求指教。[/quote] v保持原值不变。

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End. 第二次扫描数组的时候，p指针应该是指向s[3]的吧，空格，那v应该度不到值才对啊，怎么还会是123呢？既然k==0了，不就代表没有存储到东西？不懂啊，求指教。

user: user-0
content: 引用 8 楼 ant2012 的回复: 我这没问题啊，第三次由于有个A出的问题 完全正确呀，不过你用的是VC++， 我用gcc。难道是编译器的问题？

user: user-2
content: 我这没问题啊，第三次由于有个A出的问题

user: user-1
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-0
content: 书中源程序是采用scanf_s()可选函数，因为我的编译器不完全支持C11，所以没法用。只能用回scanf(),不知代是否是这个原因，三次调用的过程互相干扰了？

user: user-0
content: 引用 3 楼 user-3 的回复:第二次try_input 中： 第一个格式控制符%4f， 也就是接收一个包含4个字符的浮点数， -2.35包含5个字符，所以只截断到-2.3， 第二个格式控制符%4d，接收了最后一个5  第三次try_input，我测试没有问题，只是接收的数据不对 因为第二个格式控制符%4d，接收了那个A，因为格式不正确，输入结束，后面的数字和字符串没有得到输入内容 嗯，书中也是这样解释的啊，只是第二次测试byte_count应该是19，我得出20；第三次测试很奇怪，根本没有给我输入的机会，调用直接结束程序。

user: user-0
content: 引用 1 楼 ant2012 的回复:楼主%4f应该改成%.4f吧，4前面加一个点 我也是桉书上的例子做的。书上说%4f说的是提取前4个字符，就把-2.3提出，然后再用浮点数表示了。

user: user-3
content: 第二次try_input 中： 第一个格式控制符%4f， 也就是接收一个包含4个字符的浮点数， -2.35包含5个字符，所以只截断到-2.3， 第二个格式控制符%4d，接收了最后一个5  第三次try_input，我测试没有问题，只是接收的数据不对 因为第二个格式控制符%4d，接收了那个A，因为格式不正确，输入结束，后面的数字和字符串没有得到输入内容

user: user-2
content: %4d, %*d等这些格式是格式化输出数据宽度的，在输入数据时，好像没个必要吧

user: user-2
content: 楼主%4f应该改成%.4f吧，4前面加一个点
user-0 提问: 求助！Mac使用什么开发工具查看内存地址

回复:
user: user-1
content: hopper debugger 也不错

user: user-2
content: xcode Debug->Debug Workflow->view memory  address输入内存地址   就能看

user: user-3
content: Mac都是有Xcode开发的，Xcode的功能和Vs人功能基本上差不多。  Xcode设置断点后就能看到变量的地址和值。
user-0 提问: 关于调用linux下的daemon函数出现的线程退出问题。

回复:
user: user-0
content: 引用 1 楼 zxhuser-2 的回复:http://blog.csdn.net/hunhunzi/article/details/6094719谢谢了

user: user-0
content: 引用 2 楼 lgbxyz 的回复: int main(void) {    	if(daemon(1,0) < 0)	 	{ 		perror("daemon:"); 		return -1; 	} 	 	aa();     pthread_join(tid, NULL);      	return 0;  }  谢谢，明白了此中的奥秘

user: user-1
content: int main(void) {    	if(daemon(1,0) < 0)	 	{ 		perror("daemon:"); 		return -1; 	} 	 	aa();     pthread_join(tid, NULL);      	return 0;  }

user: user-2
content: http://blog.csdn.net/hunhunzi/article/details/6094719
user-0 提问: 求一个c或c++程序，能够求解逻辑表达式求真假的问题，思路和程序要是都有就最好了！

回复:
user: user-1
content: http://www.th7.cn/Program/cp/201309/151090.shtml

user: user-1
content: 楼主应该是想在运行的时候输入字符串：((3<2)  ||  (1 > 0)) && ( "abc"=="a")) ， 然后可以给用户一个结果？  这个需要分割字符串，从优先级高的开始逐层处理，可能还需要检查下字条串是否正确等，步骤还是有点繁琐，不过不是很难

user: user-2
content: c++ 运算符重载

user: user-3
content: 参考Tiny C Compiler源代码。

user: user-4
content: gcc开源的,里面有这个代码的

user: user-5
content: 直接输出布尔表达式，不就知道结果了吗？
user-0 提问: 指针变量与一维数组

回复:
user: user-1
content: 指针可以使用[index]方式引用，这种引用时基于首地址的便宜，如楼主的描述（a是野指针哦）：a[0]即首地址便宜0*1个字节，a[1]即首地址偏移：1*1个字节。

user: user-2
content: unsigned char *a=new char [10]; //或者 unsigned char b[10]; //unsigned char *a=b; 不过是用函数调用表达式，给 a[0],a[1] 赋值罢了； 函数调用表达式的值，就是函数返回值。

user: user-3
content: 编译器对 a[i] 的解释是 *(a + i * sizeof(a[0])), ，这种方式被称为语法糖，用来简化书写