Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 菜鸟自学c入门，求大神解答一下困惑

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: long int 最大是2147483647

user: user-3
content: 越界了，超出long int表示的范围了。  建议用字符串比较合适。  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(void) {     char str[32];     int ret, len, sum = 0, i;      printf("请输入数字:");     ret = scanf("%s", str);      while (ret && str[0] == '-') {         printf("请输入大于0的数字:");         ret = scanf("%s", str);     }     do {         len = strlen(str);         i = 0;         while (str[i]) {             sum += str[i++] - '0';         }         if (sum == 0) {             printf("请输入大于0的数字:");             ret = scanf("%s", str);         }     } while (sum == 0);       printf("位数：%d, 各位数之和为%d\n", len, sum);      return 0; } 供参考～   对于以0开头的数字，就会有问题，建议完善一下

user: user-0
content: 引用 5 楼 ?Victor.??的回复:试试这个 #include <stdio.h> int main() {     int sum=0; 	int count=0;     long long int num;     printf("请输入数字：");     scanf("%lld",&num);     do{         if(num<0)         {             printf("请输入大于0的数字:");             scanf("%lld",&num);         }     }while(num<0);       while(num!=0)     {         sum+=num%10;         num/=10;         count++;     }     printf("位数%d，各位数之和为%d。\n",count,sum); }  %l64d是什么操作 现在没啥问题了

user: user-0
content: 引用 5 楼 ?Victor.??的回复:试试这个 #include <stdio.h> int main() {     int sum=0; 	int count=0;     long long int num;     printf("请输入数字：");     scanf("%lld",&num);     do{         if(num<0)         {             printf("请输入大于0的数字:");             scanf("%lld",&num);         }     }while(num<0);       while(num!=0)     {         sum+=num%10;         num/=10;         count++;     }     printf("位数%d，各位数之和为%d。\n",count,sum); }  %l64d是什么操作 好的 万分感谢

user: user-2
content: 试试这个 #include <stdio.h> int main() {     int sum=0; 	int count=0;     long long int num;     printf("请输入数字：");     scanf("%lld",&num);     do{         if(num<0)         {             printf("请输入大于0的数字:");             scanf("%lld",&num);         }     }while(num<0);       while(num!=0)     {         sum+=num%10;         num/=10;         count++;     }     printf("位数%d，各位数之和为%d。\n",count,sum); }  %l64d是什么操作

user: user-0
content: 引用 3 楼 ?Victor.??的回复:[quote=引用 2 楼 m0_46379100 的回复:] [quote=引用 1 楼 ?Victor.??的回复:]long int 最大是2147483647 我使用long long后为什么总是会输出12位数，而且各位数只和也不正确[/quote] 你贴一下源码，我试一试[/quote] #include <stdio.h> #include <stdlib.h> #include <math.h> int main() {     int sum=0,count=0;     long long num;     printf("请输入数字：");     scanf("%l64d",&num);     do{         if(num<0)         {             printf("请输入大于0的数字:");             scanf("%l64d",&num);         }     }while(num<0);       while(num!=0)     {         sum+=num%10;         num/=10;         count++;     }     printf("位数%d，各位数之和为%d。\n",count,sum); }

user: user-2
content: 引用 2 楼 m0_46379100 的回复:[quote=引用 1 楼 ?Victor.??的回复:]long int 最大是2147483647 我使用long long后为什么总是会输出12位数，而且各位数只和也不正确[/quote] 你贴一下源码，我试一试

user: user-0
content: 引用 1 楼 ?Victor.??的回复:long int 最大是2147483647 我使用long long后为什么总是会输出12位数，而且各位数只和也不正确
user-0 提问: 关于C语言中限时的问题

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: SetTimer一时爽

user: user-3
content: 游戏开始的时候time_t start = time(NULL); 在每次游戏过程中判断: if (time(NULL) - start >= 60) {       game_over(); }

user: user-4
content: vc mfc 里面有定时器

user: user-5
content: 可以考虑用多线程，一个线程用于计时，定为线程1，另一个线程用于处理得分，定为线程2。

user: user-5
content: 可以考虑用多线程，一个线程用于计时，一个用于计分。

user: user-6
content: Linux下有alarm，win32应该也有api的
user-0 提问: debug可以运行，但是run就会异常终止

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 救救孩子吧，本来一直靠debug发现错误修正，结果现在debug运行也不报错
user-0 提问: 求解

回复:
user: user-1
content: 为了避免上一次的输入缓存残留的回车符造成影响，控制得当可以不需要前面的空格 比如 scanf(“%d”, &a); scanf(“%c”, &c); printf(“%d,%d\n”, a, c); 输入 5回车 看看第二行scanf会不会等待输入？看看c是什么？

user: user-2
content: 都可以加，也可以不加，运行时没什么区别的
user-0 提问: 大神帮忙看看这道删除链表哪里有问题啊…

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 建议直接贴代码～

user: user-3
content: 前面的代码是没有空头结点的ListNode链表，如果有初始化的时候多一次判断就是了

user: user-3
content: struct ListNode * delete（struct ListNode * head） {              if ( NULL == head ) return head;                // 空表           if ( NULL == head->next ) return head;     // 只有一个元素的表           ListNode* pFirst, * pSecond;           pFirst = head;  pSecond  = head->next;           while ( pSecond ) {                  if ( pFirst->val == pSecond->val ) {                       pFirst->next =pSecond->next;                       free(pSecond);                       pSecond = pFirst->next;                       continue;                 }                 pFirst = pSecond;                 pSecond = pSecond->next;           }           return head; // 无论如何head指针都不会变 }

user: user-4
content: 删除第一个while上面的两句代码。删除第一个if第三句p=p->next

user: user-0
content: 引用 1 楼 user-4 的回复：删除第一个while上面的两句代码。删除第一个if第三句p=p->next还是不对，他输出的还是1233啊
user-0 提问: MiniGui 大号逻辑字体有脏点

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 本帖子已结，处理方法看我博客
user-0 提问: realloc错误

回复:
user: user-1
content: 引用 2 楼 tjw316248269 的回复:[quote=引用 1 楼 自信男孩 的回复:] realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 注意，要用keys作为返回值，即 keys = realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 我后来改成了用keys做返回值，说我数组越界，我看我程序其他地方，不存在越界情况。所以应该还是这里出问题了。 最重要的是，为什么我在windows跑这个，没有返回值，keys的size也realloc了？Linux下gcc就不行了[/quote] 问一下你的keys里之前有没有内容？看到你用strlen了，需要确认一下传入keys时，里面是否有字符串？ 如果没有，那么就会有问题。

user: user-0
content: 引用 1 楼 自信男孩 的回复:realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 注意，要用keys作为返回值，即 keys = realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 我后来改成了用keys做返回值，说我数组越界，我看我程序其他地方，不存在越界情况。所以应该还是这里出问题了。 最重要的是，为什么我在windows跑这个，没有返回值，keys的size也realloc了？Linux下gcc就不行了

user: user-1
content: realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 注意，要用keys作为返回值，即 keys = realloc(keys, (bufLen + KEY_LEN) * sizeof(char));
user-0 提问: 有没有人会这道题的

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: dai+m*i 顺序存储跟数组一样

user: user-3
content: 画图，或者用数组。

user: user-4
content: 看起来是一个小学5年纪的数学应用题 也就涉及一点加减乘除四则运算  不会请从小学数学开始重新学习

user: user-5
content: 3楼说得对  引用 3 楼 m0_46108109 的回复:dai+m*i 顺序存储跟数组一样
user-0 提问: 求大佬指点！数据结构与算法

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 要原码谷歌百度一下就好了 要问问题就自己先写代码，有不对的地方再贴出来询问

user: user-3
content: 数据结构的题目，离不开画图。
user-0 提问: 兼容任务，跪求大佬写一下

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html
user-0 提问: 想请大神们帮我看看这个为什么运行出来没结果

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 单步执行、设置断点，试试。
user-0 提问: dev c++搞事情，请教大神

回复:
user: user-0
content: 引用 1 楼 與蘤舊縐 的回复:没有引用你想干嘛，dev可不会自动导包 哎呀呀，忘了声明了，尴尬尴尬

user: user-1
content: 这种最好定义头文件，可以用.hpp，关于h和hpp百度即可

user: user-1
content: 没有引用你想干嘛，dev可不会自动导包
user-0 提问: 求解

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 2 楼 自信男孩的回复:是因为输入1后，后面b接收的是换行符'\n'，所以c接收的是a。你可以通过b的输出可以知道接收的是换行符 嗯嗯多谢(o^^o)那我在%c前面加个空格就都可以了 还想再问一下为什么下面%f不需要在前面加空格

user: user-2
content: 把scanf("% c", &b); %和c中间的空格去掉试试看

user: user-3
content: 是因为输入1后，后面b接收的是换行符'\n'，所以c接收的是a。你可以通过b的输出可以知道接收的是换行符

user: user-4
content: 是不是按了2次换行符?
user-0 提问: 用LED灯做一个三秒全亮。

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 通过p2口。

user: user-0
content: 就是需要一个LED灯延时三秒的程序。
user-0 提问: fgets问题

回复:
user: user-1
content: 引用 2 楼 zedd3337502212 的回复:[quote=引用 1 楼 自信男孩 的回复:] 注意数组越界是未定义行为，即可能没问题。 这个没问题，可能是系统分配的字节数比你要求的多导致的。但是这个不要寄希望系统多分配，要根据实际需要来决定申请多少个 所以就是说这种赋值方式可能出错可能没错，实际编程中即使不报错也不要写这种有风险的代码对吗？[/quote] 当然，不能让数组越界呢。所以，要根据需要多申请一些空间。

user: user-0
content: 引用 1 楼 自信男孩 的回复:注意数组越界是未定义行为，即可能没问题。 这个没问题，可能是系统分配的字节数比你要求的多导致的。但是这个不要寄希望系统多分配，要根据实际需要来决定申请多少个 所以就是说这种赋值方式可能出错可能没错，实际编程中即使不报错也不要写这种有风险的代码对吗？

user: user-1
content: 注意数组越界是未定义行为，即可能没问题。 这个没问题，可能是系统分配的字节数比你要求的多导致的。但是这个不要寄希望系统多分配，要根据实际需要来决定申请多少个
user-0 提问: 求大佬帮小白我看看这个源代码，哪里错了，能运行为啥它就出不来结果

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 直接发代码多好

user: user-3
content: 没带放大镜，看不清楚。

user: user-4
content: 引用 3 楼 weixin_46298094 的回复:[quote=引用 1 楼 ?Victor.??的回复:]看不清 我私发给你好不，帮我看看[/quote] 好的，能力有限，不一定能看明白

user: user-0
content: 引用 1 楼 ?Victor.??的回复:看不清 我私发给你好不，帮我看看

user: user-0
content: 抱歉抱歉，那个没加载原图

user: user-4
content: 看不清
user-0 提问: 【C语言】"abc" 和 { 'a', 'b', 'c' } 有什么区别？

回复:
user: user-1
content: 引用 9 楼 关于0318 的回复:[quote=引用 1 楼 真相重于对错 的回复:] 引用 3 楼 lin5161678 的回复: 引用 8 楼 自信男孩 的回复: 可不可以这样理解： "abc" 返回一个地址，指向 'a'，并且后续有 'b', 'c', '\0' { 'a', 'b', 'c' } 返回一个一个值，这个值就是 'a', 'b', 'c'[/quote]不可以

user: user-0
content: 引用 1 楼 真相重于对错 的回复: 引用 3 楼 lin5161678 的回复: 引用 8 楼 自信男孩 的回复: 可不可以这样理解： "abc" 返回一个地址，指向 'a'，并且后续有 'b', 'c', '\0' { 'a', 'b', 'c' } 返回一个一个值，这个值就是 'a', 'b', 'c'

user: user-2
content: 第一个是字符串，第二个是字符数组。当然第一个也是字符数组，只不过第一个字符数组比第二个每个数组都多一个'\0'

user: user-1
content: 引用 4 楼 关于0318 的回复:[quote=引用 3 楼 lin5161678 的回复:] "abc" 作为 char数组初始化项的时候 是{ 'a', 'b', 'c', 0 }的简写 其他地方 "abc"是一个char[4] 数组 这两行是不是有笔误，大佬，我看着有点不太明白[/quote] char str[] = "123"; 和 char str[] = {'1', '2', '3', 0}; 意思完全一样  这里的 "123" 是  {'1', '2', '3', 0} 的简写 除了初始化char数组这种情况之外的 "123"是一个char[4]数组 和  {'1', '2', '3', 0} 完全没关系

user: user-3
content: 然后，你再看一下啊  char str[]="abc"; size_t s = sizeof(str)；是多少？

user: user-3
content: 引用 2 楼 关于0318 的回复:[quote=引用 1 楼 真相重于对错 的回复:] 第二个每一个最后一个字符不是\0  可是我试了一下 [/quote] char a[]={'a','b','c'}; size_t s =sizeof(a); 看看 s是多少，而不是看s[3]是不是等于‘\0';

user: user-0
content: 引用 3 楼 lin5161678 的回复:"abc" 作为 char数组初始化项的时候 是{ 'a', 'b', 'c', 0 }的简写 其他地方 "abc"是一个char[4] 数组 这两行是不是有笔误，大佬，我看着有点不太明白

user: user-1
content: "abc" 作为 char数组初始化项的时候 是{ 'a', 'b', 'c', 0 }的简写 其他地方 "abc"是一个char[4] 数组  这里 "abc"是作为 char*的初始化 注意 这里不是 char[] 初始化  这里的"abc"是一个数组 而不是 简写  和   { 'a', 'b', 'c', 0 } 完全没联系   char *b[] = {   { 'a', 'b', 'c' },   { 'b', 'c', 'd' } } b[0]是一个char*  初始化必须是一个char* 或者可以转换为char*的表达式  { 'a', 'b', 'c' } 不符合这两个条件 这里是语法错误

user: user-0
content: 引用 1 楼 真相重于对错 的回复:第二个每一个最后一个字符不是\0  可是我试了一下

user: user-3
content: 第二个每一个最后一个字符不是\0
user-0 提问: 求解

回复:
user: user-1
content: 没错啊，，，，八进制是要写成 061 啊，十六进制是要写成 0x 开头啊。相信你自己！

user: user-2
content: int a = 061; int b = 0x30; int c = 48;    建议自己写个小程序把这个三个变量输出一下，以%d输出。 自己验证一下～
user-0 提问: 红色输入函数代码要求循环5次，但是运行编译的时候是输入6次，为什么？

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复: scanf("%f",&a[i]); 去掉'\n' 标准输入是行缓冲，因此不需要用'\n'匹配，需要输入换行符才会将缓冲区的数据刷到内存里。感谢

user: user-1
content: [code=c]scanf("%f",&b[i]);[/code 这个也是，去掉'\n'

user: user-1
content: scanf("%f",&a[i]); 去掉'\n' 标准输入是行缓冲，因此不需要用'\n'匹配，需要输入换行符才会将缓冲区的数据刷到内存里。
user-0 提问: pta Reversing Linked List 求助

回复:
user: user-1
content: 说一下需求吧

user: user-0

user: user-0
content: 求大佬指点啊QAQ

user: user-1
content: 引用 6 楼 939493 的回复:[quote=引用 3 楼 自信男孩 的回复:] 说一下需求吧 求大佬帮我看一下我的代码什么地方有问题！！ 这道题我想用纯链表做... 79行到105行的代码我改过了   List L2,x1,x2,x3;     x1=newL->Next;     L2=(List)malloc(sizeof(Node));     L2->Next=NULL;     x2=L2;     while(x1){     	x3=(List)malloc(sizeof(Node));     	x3->adress=x1->adress;     	x3->data=x1->data;     	if(x1->Next){     		x3->nextadress=x1->Next->adress; 		}else{ 			x3->nextadress=-1; 		} 		x2->Next=x3; 		x2=x3; 		x1=x1->Next; 	} 	x2->Next=NULL;                                List f;     f=L2->Next;  [/quote]  说一下需求，是指代码的需求，就是这个代码是实现什么什么的。 楼主的代码最好能定义多个函数，不要都写到main函数里，代码可读性不好。

user: user-0
content: 引用 3 楼 自信男孩 的回复:说一下需求吧 求大佬帮我看一下我的代码什么地方有问题！！ 这道题我想用纯链表做... 79行到105行的代码我改过了   List L2,x1,x2,x3;     x1=newL->Next;     L2=(List)malloc(sizeof(Node));     L2->Next=NULL;     x2=L2;     while(x1){     	x3=(List)malloc(sizeof(Node));     	x3->adress=x1->adress;     	x3->data=x1->data;     	if(x1->Next){     		x3->nextadress=x1->Next->adress; 		}else{ 			x3->nextadress=-1; 		} 		x2->Next=x3; 		x2=x3; 		x1=x1->Next; 	} 	x2->Next=NULL;                                List f;     f=L2->Next;

user: user-0
content: 引用 4 楼 寻开心 的回复:List L2,x1,x2;     x1=newL->Next;     x2=x1->Next;     L2=newL;     for(i=0;i<n;i++){         if(x2->Next){  80行前后这一段，你能确保newL当中至少有两个元素吗？ 如果只有一个元素的话，x2 = x1->next， x2就是NULL， for循环里面的x2->next就是错误访问了 我改了一下这部分代码  List L2,x1,x2,x3;     x1=newL->Next;     L2=(List)malloc(sizeof(Node));     L2->Next=NULL;     x2=L2;     while(x1){     	x3=(List)malloc(sizeof(Node));     	x3->adress=x1->adress;     	x3->data=x1->data;     	if(x1->Next){     		x3->nextadress=x1->Next->adress; 		}else{ 			x3->nextadress=-1; 		} 		x2->Next=x3; 		x2=x3; 		x1=x1->Next; 	} 	x2->Next=NULL; 段错误的问题是没了 但是我自己运行跟样例是一样的 提交还是错误..   引用 4 楼 寻开心 的回复:List L2,x1,x2;     x1=newL->Next;     x2=x1->Next;     L2=newL;     for(i=0;i<n;i++){         if(x2->Next){  80行前后这一段，你能确保newL当中至少有两个元素吗？ 如果只有一个元素的话，x2 = x1->next， x2就是NULL， for循环里面的x2->next就是错误访问了 我改了一下这部分代码  List L2,x1,x2,x3;     x1=newL->Next;     L2=(List)malloc(sizeof(Node));     L2->Next=NULL;     x2=L2;     while(x1){     	x3=(List)malloc(sizeof(Node));     	x3->adress=x1->adress;     	x3->data=x1->data;     	if(x1->Next){     		x3->nextadress=x1->Next->adress; 		}else{ 			x3->nextadress=-1; 		} 		x2->Next=x3; 		x2=x3; 		x1=x1->Next; 	} 	x2->Next=NULL; 自己测试的数据是对的 但是提交了就是错误的....

user: user-2
content: List L2,x1,x2;     x1=newL->Next;     x2=x1->Next;     L2=newL;     for(i=0;i<n;i++){         if(x2->Next){  80行前后这一段，你能确保newL当中至少有两个元素吗？ 如果只有一个元素的话，x2 = x1->next， x2就是NULL， for循环里面的x2->next就是错误访问了
user-0 提问: 求助！！！c语言：数值数组为什么只能利用循环才能输出所有元素？

回复:
user: user-1
content: 没有办法，这是打印格式的规则。%s会从数组首地址开始按字符打印，直到遇到'\0'字符才结束打印，%d就只是打印一个整形。 而且数组的地址是个数组指针，所以printf("%d\n",&arr); 就是打印一个地址而已

user: user-2
content: 字符数组是因为有'\0'，即字符串结束标记。%s输出其实是一个字符一个字符输出直到遇到'\0'结束。  %d输出是输出内存4个字节（32位系统）的内容。

user: user-3
content: 数组就是数组，代表的是是同类型的一个连续的存储区域； 但是直接拿数组的名字使用的时候，除了sizeof函数，都是在把它当做指针来使用的 函数传参的时候一样， 数组的名字就是指针，你无法把一个数组所有的数据都作为参数传进去  其实你可以想一下，自己如何来实现这个printf函数来打印数组的 你可以定义一个函数MyPrintf（），要打印数组，你如何传递参数？  需要一个指针，还需要一个大小 光传递一个指针进去是不行的 void MyPrintf(int a[10]) {        printf("%d\n",  sizeof(a) / sizeof(int)); } int main () {      int a[10];      printf("%d\n",  sizeof(a)/sizeof(int));      MyPrintf(a);     return 0; }  你猜， MyPrintf函数会打印出什么？  1， 2， 还是10？   试验告诉我们，函数传参进来后，你即便传递给它的是一个数组对象，但是传递进来的它还就是一个指针 你不知道他的大小，自然就无法打印整个数组了

user: user-4
content: 对于数值数组你也可以使用printf("%s",arr)；进行打印，但是由于数值数组的值中是否有‘\0’值，却不得而知，打印的也可以是乱码。 对于字符数组，如果printf中的输出控制符使用%c,或乾%d，也是要逐一遍历字符数组才可以的。
user-0 提问: c语言怎么样才能够统计文件中每行有多少个空格，并只保留每行中的第一个空格(｡•́︿•̀｡)

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 引用 8 楼 giarffe2333 的回复:[quote=引用 7 楼 自信男孩 的回复:] 用fscanf可以的。但是需要三个%s(fscanf("%s  %s  %s", word, means[1], means[2]);）  另外，也可以通过fgets先读取一行，然后用strtok_r/strtok分开。  每个单词建立一个结构体，一个word，两个means  struct words_msg { char word[16]; char means[2][32]; }; 但是有的单词没有两种意思，读取的时候不会出错吗[/quote] 那试试第二种方法，strtok

user: user-0
content: 救救孩子吧

user: user-0
content: 😶放错图片了，第一张图片错了

user: user-3
content: 正则表达式，可以完成。

user: user-4
content: 引用 5 楼 giarffe2333 的回复:[quote=引用 3 楼 user-4 的回复:] 每次读取一行，然后找到第一个空格所在位置，把这个空格改成'\0'，这一行就分成两个部分了 有办法每次读取一行吗[/quote] fgets() 函数每次读一行，然后 strchr() 找到第一个空格出现的位置，将这一位置为 '\0' 并记录下一位的地址，这样一行就被分为两个单词和释义两个部分

user: user-4
content: 每次读取一行，然后找到第一个空格所在位置，把这个空格改成'\0'，这一行就分成两个部分了

user: user-0
content: 引用 7 楼 自信男孩 的回复:用fscanf可以的。但是需要三个%s(fscanf("%s  %s  %s", word, means[1], means[2]);）  另外，也可以通过fgets先读取一行，然后用strtok_r/strtok分开。  每个单词建立一个结构体，一个word，两个means  struct words_msg { char word[16]; char means[2][32]; }; 但是有的单词没有两种意思，读取的时候不会出错吗

user: user-2
content: 用fscanf可以的。但是需要三个%s(fscanf("%s  %s  %s", word, means[1], means[2]);）  另外，也可以通过fgets先读取一行，然后用strtok_r/strtok分开。  每个单词建立一个结构体，一个word，两个means  struct words_msg { char word[16]; char means[2][32]; };

user: user-0
content: 引用 4 楼 proorck2019 的回复:正则表达式，可以完成。 啊？正则表达式怎么用呢..

user: user-0
content: 引用 3 楼 user-4 的回复:每次读取一行，然后找到第一个空格所在位置，把这个空格改成'\0'，这一行就分成两个部分了 有办法每次读取一行吗
user-0 提问: 这个for循环实现的数学意义是什么？

回复:
user: user-1
content: if(num % i == 0) {     flag =0;     break; }   建议加一个break，跳出循环，提高程序的效率。  如果能整除，则说明不是素数。

user: user-2
content: 判断是否是质数

user: user-3
content: 最繁琐的是 for(i = 2;i < num;i++) { if(num % i == 0) { flag =0; }  现在只是for(i = 2;i < num/2;i++),减少一半的计算量

user: user-0
content: 引用 2 楼 喜欢做我自己的回复:判断是否是素数，如果一个数可以被除1以外的整数整除，那么除数最大为该数的一半，这样就不需要进行从1到这个数的穷举计算，这样可以减少一半的计算量 能花一个for循环的计算程序框图吗我是初学者有些东西还是不太能感悟

user: user-3
content: 判断是否是素数，如果一个数可以被除1以外的整数整除，那么除数最大为该数的一半，这样就不需要进行从1到这个数的穷举计算，这样可以减少一半的计算量

user: user-4
content: 有可能是判断素数
user-0 提问: 这个表达式怎么弄？

回复:
user: user-1
content: 在所有的运算符里面，逗号的优先级是最低的。

user: user-2
content: 逗号两侧是不同的部分，=的作用范围只在逗号之前

user: user-3
content: 按照你的想法应该这么写： y=((x=a+b),b+c) 因为c语言中逗号运算符的优先级是最低的

user: user-3
content: y=(x=a+b),b+c 这种写法相当于： (y=(x=a+b)),(b+c)

user: user-4
content: 会不会是因为逗号表达式，是从右往左计算的？
user-0 提问: C语言

回复:
user: user-1
content: 同一层的宏定义最好都贴在左边写

user: user-2
content: 因为英语有事态 define和defined是不同的含义 define宏定义 defined宏定义过  #ifdef是if define的缩写 #elif是else if的缩写 直接SECOND，未明含义，SECOND被忽略了

user: user-3
content: #define不加d是声明，后面在运用时就应该加上d呢。  https://www.cnblogs.com/droidxin/p/3446451.html
user-0 提问: 想请教一个关于c语言PlaySound函数的问题

回复:
user: user-0
content: 啊啊啊还真是这个原因 对于相对路径我之前一直理解错了 谢谢！

user: user-1
content: 要和exe文件在一起的 更准确的说， 是要在执行目录下（exe都不一定在执行目录下） ide调试状态， 项目设置上会有执行目录的设置，不同的编译环境不一样 编译出来的exe比如在d:\abc\123.exe 你完全可以在c：\>的cmd提示符下，输入d:\abc\123.exe这个时候，执行目录就是c：\ 你也可以cmd进入d：\abc\目录下输入123.EXE来执行，此时执行目录就是d:\abc 、
user-0 提问: 线程中某函数返回局部变量地址后立即使用，理论上是否一定会取到正确的值？

回复:
user: user-1
content: 不正确  首先 最基本的 程序优化有可能把整个函数优化掉  根本不存在函数调用 不存在返回  你的分析就是空中楼阁 毫无意义

user: user-2
content: 不要做未定义行为，也不要浪费时间思考这种问题，堆栈清理由谁做，什么时候做，怎么做是没有标准的，具体要去查你所使用编译器的堆栈调用方式
user-0 提问: 一个结构体声明时，就算用到之后才会声明的别的结构体也不要紧？

回复:
user: user-1
content: 你这里不能做的是这样的： typedef struct dog {      struct fish * afish;    // fish将在下面才会声明，但是这里就可以使用，这么做我实际用vs运行了，正常。     fish weight; }dog;   typedef struct fish {         dog weight; }fish;  dog里面有fish类型变量，fish里面有dog类型变量， 这样就互相嵌套没完没了了，这种怎么都不行的 但是 dog *， fish *类型变量就无所谓 他们都是指针而已， 定义结构关键是能知道结构的大小， 能确定大小，你可以定义

user: user-1
content: 你自己试验一下就知道了，可以通过的  某些编译器如果不让，那大不了在最上边加上 struct fish; struct dog; 告知有这种类型存在就是了
user-0 提问: 两个结构体声明相互包含对方的指针，不需要额外做点什么就能通过编译？

回复:
user: user-1
content: 本来就可以，我想你理解错了书本的意思。指针随便你指什么类型都可以，就算是从未出现过的结构体也行(用迂腐的语言讲，这是不完整的类型，相对应的是完整类型)，只不过不能解引用罢了。

user: user-2
content: 不建议把结构体互相包含，这样做的意义是什么？相互之间定义使用起来也不好区分吧  如果需要，可以再定义一个结构体包含这两个结构体的内容。

user: user-3
content: 这两个结构体其实结构一样，只是名字不一样，定义一个结构体其实就可以了 typedef struct anystr {     Any any;     int weight; } fish, dog, *Any;

user: user-4
content: 结构的定义要解决什么事儿呢？  它只是确定结构的大小，每个元素各自占据多大地方 指针都是一样的，64位系统占据8个字节， 你说知道他是什么类型的指针有多大的差异呢  你再定一个这里根本没有导结构类型估计都能过 typedef struct dog {     struct fish * fish1;    // 包含下面将要声明的结构体fish指针     struct cat * cat;     struct monkey * monkey;      int weight; }dog;
user-0 提问: c语言动态定义数组空间报错？

回复:
user: user-0
content: 引用 6 楼 lin5161678 的回复：看起来是vs vs不支持C99 不能用VLA嗯嗯，我懂啦

user: user-0
content: 引用 5 楼 m0_46108109 的回复：这个好像是在C99中添加的，在C11中又不支持了。 你把ide的c标准换为c99试试。好的，谢谢，我也是看了视频教程后报错了，现在明白了

user: user-0
content: 引用 4 楼 xdn1ce 的回复：https://blog.csdn.net/dreamiond/article/details/73181115?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task  不能用变量定义数组大小，这种情况你就直接定义一个足够大的数组就行，类似 int arr[200]；这种。谢谢，懂了

user: user-1
content: C语言不支持不定长数组。所以，建议用malloc/free申请动态数组。

user: user-2
content: 另外 就算支持VLA 你的代码也是越界操作了

user: user-2
content: 看起来是vs vs不支持C99 不能用VLA

user: user-3
content: 这个好像是在C99中添加的，在C11中又不支持了。 你把ide的c标准换为c99试试。

user: user-4
content: https://blog.csdn.net/dreamiond/article/details/73181115?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task  不能用变量定义数组大小，这种情况你就直接定义一个足够大的数组就行，类似 int arr[200]；这种。

user: user-0

user: user-0
content: 引用 1 楼 ?Victor.?? 的回复：动态定义是什么操作？ 如果想用动态的话，还是malloc比较靠谱 发一下源码，让大家看看你想干什么吧由于我是c语言的萌新，看了视频教程后，我按照他的方法动态定义数组然后就报错了

user: user-5
content: 动态定义是什么操作？ 如果想用动态的话，还是malloc比较靠谱 发一下源码，让大家看看你想干什么吧
user-0 提问: 链表问题

回复:
user: user-1
content: #include<stdio.h> #include<string.h> #include<stdlib.h>  typedef struct data{     char name[30];     struct data *next; }node;  void output(node *head) {     node *p = head->next;     //while(p != NULL)     while(p)     {         printf("%s ",p->name);         p = p->next;     }     printf("\n"); } void insertlist(node *head,int n,char *run) {     int j = 1;     node *p,*pre = head;     while(j <= n && pre->next)     {         j++;         pre = pre->next;     }     p = (node *)malloc(sizeof(node));     strcpy(p->name,run);     p->next = pre->next;     //printf("1");     pre->next = p; } void deletelist(node *head,char *run) {     int j = 0;     node *p,*pre = head;      p = head->next;      while (p && strcmp(p->name, run) != 0) {         pre = pre->next;         p = p->next;     }     if (!p) {         printf("Can't find it!\n");         return;     }      pre->next = p->next;     free(p);     /*     while(strcmp(pre->name,run))     {         pre = pre->next;     }     p = (node *)malloc(sizeof(node));     p = pre->next;     pre->next = p->next;     free(p);     */ } void searchlist(node *head,char *run) {     node *pre;     pre = head->next;      int j = 1;     while(pre && strcmp(pre->name,run) != 0)     {         j++;         pre = pre->next;     }     if (!pre)         printf("Can't find it!\n");     else         printf("%d\n",j); } int main(void) {     int n;     char run[30];     node *head;     head = (node *)malloc(sizeof(node));     head->next = NULL;     while(scanf("%s",run) != EOF)     {         if(!strcmp(run,"insert"))         {             scanf("%d%s",&n,run);             insertlist(head,n,run);         }         else if(!strcmp(run,"show"))         {             output(head);         }         else if(!strcmp(run,"search"))         {             scanf("%s",run);             searchlist(head,run);         }         else if(!strcmp(run,"delete"))         {             scanf("%s",run);             deletelist(head,run);         }     }     return 0; }  供参考～  问题比较多，建议楼主对比代码找出自己的问题～
user-0 提问: 结构体只能通过复制本尊才能在不同的.c文件中使用吗？

回复:
user: user-1
content: 你写在头文件然后include啊 不光是c语言，很多语言也是一样的，需要import相应的包，其实就include差不多

user: user-0
content: 引用 1 楼 寻开心 的回复:结构体也是类型的一种而已， 它又不是变量 h文件里面只是它的声明，这种声明拷贝多少份都没有关系 关键是这种类型的对应的变量， 全局变量， 一个工程里面同名的只能有一个  谢谢！  我还是觉得那种把原始形式到处复制的方式好浪费，也好别扭

user: user-2
content: 结构体也是类型的一种而已， 它又不是变量 h文件里面只是它的声明，这种声明拷贝多少份都没有关系 关键是这种类型的对应的变量， 全局变量， 一个工程里面同名的只能有一个
user-0 提问: 两个.h文件中相互需要对方的元素，标准做法是怎样做的？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 最好的可扩展的方案书把相互调用的部分提出出来，作为另外的文件，这样就避免了相互调用，避免相互调用这种耦合性是非常重要的

user: user-3
content: 前置声明即可

user: user-4
content: 引用 5 楼 寻开心 的回复:A引用B的类型， B引用A类型，这种事儿很常见的啊 只要前置声明一下另外一个类型就好了 和两个文件还是一个文件都没有关系 都是属于结构定义，又不是变量声明，不会冲突 不知道相互引用的意义在哪里？使用起来不觉得容易混淆吗？

user: user-0
content: 引用 9 楼 我叫侯万楼 的回复:前置声明即可  引用 9 楼 我叫侯万楼 的回复:前置声明即可  前置声明是什么样子的？ 可以直接写出来让我看看吗？

user: user-5
content: #pragma once 这样就可以了，你试试看 不用#endif

user: user-6
content: 5楼正解 前置声明一下就可以

user: user-7
content: #if !define 了解一下！

user: user-8
content: 可不可把所有引用放在一个头文件里 然后在相应头文件里分别定义。

user: user-9
content: A引用B的类型， B引用A类型，这种事儿很常见的啊 只要前置声明一下另外一个类型就好了 和两个文件还是一个文件都没有关系 都是属于结构定义，又不是变量声明，不会冲突

user: user-0
content: 引用 3 楼 user-10 的回复:这就是你程序设计的问题了，不光是c语言，其他语言也有差不多的机制，要import相应的包（package），所以就看你怎么设计这些package了，对于c来说，就是看你怎么设计这些头文件了  谢谢！

user: user-10
content: 这就是你程序设计的问题了，不光是c语言，其他语言也有差不多的机制，要import相应的包（package），所以就看你怎么设计这些package了，对于c来说，就是看你怎么设计这些头文件了

user: user-0
content: 引用 1 楼 user-10 的回复:a和b不要交叉include，把交叉的部分抽出来做个c.h，在c.h里include a和b 比如在你这个例子中可以把haha放到c.h，你的应用程序直接iclude c就好了，因为c已经include a和b了  有没有简单无脑的处理头文件的办法，如果一个工程很大的话，每次都要费神怎么安排头文件的话，感觉好累啊

user: user-10
content: a和b不要交叉include，把交叉的部分抽出来做个c.h，在c.h里include a和b 比如在你这个例子中可以把haha放到c.h，你的应用程序直接iclude c就好了，因为c已经include a和b了
user-0 提问: c语言求助

回复:
user: user-1
content: 没看出 有啥问题， strcpy内存重叠也是可以的，不会出问题 void deletestr(char * str, const char * strd) {     while (1) {         char * pos = strstr(str, strd);         if ( NULL == pos ) return;         strcpy(pos, pos+strlen(strd));         printf("%s\n", str);     } } int main(int argc, const char * argv[]) {     char str[] = {"00111001110011000010000"};        printf("01234567890123456789012\n%s\n", str);     deletestr(str, "1");     printf("01234567890123456789012\n%s\n", str);     return 0; }  你试试看看， 是在什么地方输出不正常的 正常情况下，deleteStr函数当中strcpy每执行一次， 输出字符串会短一个字符 01234567890123456789012 00111001110011000010000 0011001110011000010000 001001110011000010000 00001110011000010000 0000110011000010000 000010011000010000 00000011000010000 0000001000010000 000000000010000 00000000000000 01234567890123456789012 00000000000000

user: user-0
content: 试过了不行，搞了3天了头皮发麻

user: user-2
content: 源串和目标串重叠，用另外一个函数。
user-0 提问: 关于c语言结构体的知识盲点

回复:
user: user-1
content: typedef struct后面没有加名字，所以才有这么回事，这里定义成员属性的时候是不认别名的

user: user-0
content: 引用 1 楼 程序代码的回复:做链表当然不能这样定义 虽然知道不能这样定义   不过为什么可以通过呢  而且运行也没错误。。   想不通

user: user-2
content: 做链表当然不能这样定义
user-0 提问: 你们是怎么一看自己写的方法就知道这个方法来自哪个文件的？

回复:
user: user-1
content: 我是菜鸟,我的理解是按照功能模块新建文件夹和头文件,同模块相关函数在同一头文件中.这样在那个模块里面就编写那个模块的东西.不会混淆,也很容易找到.见名知意变知道在那个头文件里面

user: user-2
content: 靠文档，除了敲代码，还需要写文档。

user: user-3
content: 选个智能点的编辑器也行，jetbrains的IDE都支持显示函数具体信息的，包括来自哪里，不过需要开启一下

user: user-4
content: 你自己都说出答案了啊。 命名规则 不能所有变量都a，b，c，d，函数都fun1，fun2的 行数名字和文件名字长点没关系，现代的编辑器都带自动输入功能的， 输入几个字母后面就自动出来了
user-0 提问: Dev-C++小白求助

回复:
user: user-1
content: 第一个问题练习编程的时候别新建项目，直接新建源文件。

user: user-2
content: ①都是工程文件，不用管他们。 ②我觉得是路径里的空格造成的。

user: user-3
content: 重新安装dev，选腾讯管家或者360软件库里的那个
user-0 提问: vc6.0

回复:
user: user-0
content: 引用 8 楼 proorck2019的回复:我猜问题在于66.obj，把vc关了再开行不？ 谢谢大家我弄好了 有不会的可以问

user: user-0
content: 引用 8 楼 proorck2019的回复:我猜问题在于66.obj，把vc关了再开行不？ 不是的要改程序

user: user-1
content: 我猜问题在于66.obj，把vc关了再开行不？

user: user-0
content: 拜托大家帮帮忙

user: user-2
content: 引用 5 楼 Jiayoubiancheng 的回复:[quote=引用 3 楼 與蘤舊縐的回复:][quote=引用 2 楼 自信男孩 的回复:] 没学，还是什么原因？  如果是代码编译问题，建议贴出源码～  应该是编译器设置问题，错误下面已经显示了error spawning，前几天有个一样的问题，应该和代码无关[/quote] 对啊 百度上说改路径 我改好了就闪退了  然后又不行了[/quote]  没用过，没什么好办法，或许你可以换个安装包试试，另外CSDN的帖子周围也不是只有广告，你看周边都是和你的问题相关的，可以看看

user: user-0
content: 引用 3 楼 與蘤舊縐的回复:[quote=引用 2 楼 自信男孩 的回复:] 没学，还是什么原因？  如果是代码编译问题，建议贴出源码～  应该是编译器设置问题，错误下面已经显示了error spawning，前几天有个一样的问题，应该和代码无关[/quote] 对啊 百度上说改路径 我改好了就闪退了  然后又不行了

user: user-0
content: 老师要用vc的

user: user-2
content: 引用 2 楼 自信男孩 的回复:没学，还是什么原因？  如果是代码编译问题，建议贴出源码～  应该是编译器设置问题，错误下面已经显示了error spawning，前几天有个一样的问题，应该和代码无关

user: user-3
content: 没学，还是什么原因？  如果是代码编译问题，建议贴出源码～

user: user-2
content: 前几天看到有人和你同一个问题，听说百度的办法都没用，建议你方便的话还是换一个编译器吧，新手用dev还是比较友好的
user-0 提问: strncmp测试问题，十六进制

回复:
user: user-0
content: 引用 3 楼 寻开心 的回复:strncmp只比较两个字符串的前n个数是否一致 abcd和ABCD作为字符， 是不一样的， strncmp是字符的比较，所以结果就不同  至于第二个为什么相同， 是因为， 0x00是字符串的结束标志 strncmp遇到结束就自动停止了，并不会再去比较后面的字符 两个都是空字符串，结果就是一样，所以是0返回是因为0x00，没有类比strcmp，谢谢大佬

user: user-0
content: 引用 4 楼 自信男孩 的回复:0x00不就是0，就是'\0'了吗？因为strncmp认为已经到了字符串末尾，所以后面的就不比较了。所以认为是相同的。谢谢，我笨了，既然是strcmp的扩展，其特性居然没有引用过来

user: user-0
content: 引用 1 楼 user-3 的回复:那是因为0x00是字符串结束符，所以只比较了第一个字符 是因为0x00的原因，谢谢大佬

user: user-1
content: 0x00不就是0，就是'\0'了吗？因为strncmp认为已经到了字符串末尾，所以后面的就不比较了。所以认为是相同的。

user: user-2
content: strncmp只比较两个字符串的前n个数是否一致 abcd和ABCD作为字符， 是不一样的， strncmp是字符的比较，所以结果就不同  至于第二个为什么相同， 是因为， 0x00是字符串的结束标志 strncmp遇到结束就自动停止了，并不会再去比较后面的字符 两个都是空字符串，结果就是一样，所以是0返回

user: user-3
content: 如果是这样，建议用memncmp内存比较

user: user-3
content: 那是因为0x00是字符串结束符，所以只比较了第一个字符
user-0 提问: 萌新插入排序求助，找不到哪里有问题。。

回复:
user: user-0
content: 引用 3 楼 a____jun的回复:你的逻辑有问题  所以你的方法是错误的！ 下面是我写的排序代码  供参考  ~  #include<stdio.h> int main() { int a[6]={10,4,9,5,0,2}; int i,j,temp; for(i=0;i<6;i++) { 	for(j=i+1;j<6;j++) 	if(a[i]>a[j]) 	{ 		temp=a[i]; 		a[i]=a[j]; 		a[j]=temp;	 	} }  for(i=0;i<6;i++) printf("%d ",a[i]); return 0; } 怪不得，谢谢啦

user: user-0
content: 引用 2 楼 與蘤舊縐的回复:交换之前用a[j]和a[i]比不正确，如果要把3移动到6、7之前，第一次637，第二次比的就是6和7了，逻辑有点问题 好的，多谢(o^^o)

user: user-1
content: 你的逻辑有问题  所以你的方法是错误的！ 下面是我写的排序代码  供参考  ~  #include<stdio.h> int main() { int a[6]={10,4,9,5,0,2}; int i,j,temp; for(i=0;i<6;i++) { 	for(j=i+1;j<6;j++) 	if(a[i]>a[j]) 	{ 		temp=a[i]; 		a[i]=a[j]; 		a[j]=temp;	 	} }  for(i=0;i<6;i++) printf("%d ",a[i]); return 0; }

user: user-2
content: 交换之前用a[j]和a[i]比不正确，如果要把3移动到6、7之前，第一次637，第二次比的就是6和7了，逻辑有点问题
user-0 提问: 【求教贴】我的编译器瓦特啦

回复:
user: user-0
content: 引用 4 楼 與蘤舊縐的回复:重启、重装，完事皆解 我已经卸载过了⊙_⊙

user: user-0
content: 引用 5 楼 yshuise的回复:你写的代码如此奇怪！ 跟郝斌学的…

user: user-1
content: 你写的代码如此奇怪！

user: user-2
content: 重启、重装，完事皆解

user: user-2
content: 那就有点迷了，看编译信息却时常是编译了这个文件啊

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:你是只运行，未重新编译，用f11重新编译试试 试过了，f9编译 f10运行，还有f11编译运行……

user: user-2
content: 你是只运行，未重新编译，用f11重新编译试试
user-0 提问: 学生求助！！请大神看一下错在了哪里？

回复:
user: user-0
content: 谢谢大佬解答

user: user-1
content: for(i=1;;i++) { a=a/10; if(a/1==0) { break; } 这里循环出来以后a的值已经是0了 int f(int a) { int b = a; int i;   e=b/pow(10,n-1); 这样改一下
user-0 提问: visual studio 是不是对c语言的语法有很强的自动容错处理啊？

回复:
user: user-1
content: 省略了很多东西，少了很多坑，便于开发、效率高、麻烦少，不利于深入学历、不利于理解一些东西的本质。

user: user-2
content: 这个是C编译器的行为。C编译器即使不声明函数，也可以调用。但是会出现链接错误。gcc也是一样的： 只会提示  warning: implicit declaration of function 'fun'

user: user-3
content: 这不算吧，警告可能不影响代码执行。  楼主最好贴出代码～针对具体代码来讨论～

user: user-4
content: 引用 楼主 wow334 的回复:比如：  一个a.c文件中的方法，连原型都不写，在main.c也能调用。  这和书上说的c语言语法完全不一样啊。  是不是visual studio 是不是对c语言的语法有很强的自动容错处理？  我要怎么设置visual studio，让它严格遵照c语言书上的语法规则。 visual studio 管理工程有自动管理源文件的，编译查找源文件，如果你要写跨平台，就必须按照C的标准来写。

user: user-5
content: 语言在进步，就按vs中规定的语法来吧。 应该不是vs的问题，是语言版本改进了。
user-0 提问: C语言

回复:
user: user-1
content: 字符串长度为6 i从0到5 size=7,size-i-2从5到0

user: user-2
content: size - 1好理解，因为数组下表是从0开始的。-2也好理解一些，即不修改最后一个字符'\0'，逆序我想是不改变字符串结束标记的。

user: user-0
content: 是size-i-1吗
user-0 提问: 7-9 三角形判断（15 分）

回复:
user: user-1
content: 楼主问题解决了吗，我也遇到了同样的问题。。

user: user-2
content: 楼主只有最后一道题错， 说明错误不是在公式本身上， 要是公式有错， 那就不是一道题的问题了 应该还是边界条件的可能性更大

user: user-2
content: 引用 5 楼 真相重于对错 的回复:其实就是求fabs (y2-y1/x2-x1)和 fabs(y3-y1/x3-x1) 是否相等  不是fabs都，那个不对滴 是  fabs( (x1-x2)*(y2-y3) - (x2-x3)*(y1-y2)) < 1e-12  不能多套fabs  写到这个，不得不抱怨楼主，你就不能弄两个中间变量啊  dx1=x2-x1， dy1=y2-y1， dx2=x3-x1， dy2=y3-y1 这一遍遍的算麻烦不说， 恢复还要一遍一遍的重复敲    dy1/dx1  和 dy2/dx2 相当于是斜率 斜率必须相同才是对的，  -dy1/dx1 和 dy1/dx1 可不是在一条直线上啊（斜率k和-k是关于坐标轴对称的关系）  只能是 fabs( dx1*dy2 - dx2*dy1) < 1e-12 这么判断

user: user-3
content: 分数比较，其实是通分后或者化简后，分子比分子，分母比分母，只要点的坐标是用整形表示，就不用考虑浮点。

user: user-0
content: 引用 9 楼 真相重于对错的回复:算面积也要涉及浮点数运算，不精确。 最好是计算这3个点之间的矢量， 上边我回复有点问题，三角函数早丢了，计算 (y2-y1) /(x2-x1) 和(y3-y1) /(x3-x1) 是否相等。两个分数分别转化为最简式，通过约分，判断分母是否相等且分子是否相等，相等则无法形成三角形，不等既可以。 我也是这么想的，我就是把除法转化成乘法，防止它分母万一是0，具体在浮点数运算的时候到底哪个地方会有精度的不准确啊，还望大佬指教

user: user-3
content: 算面积也要涉及浮点数运算，不精确。 最好是计算这3个点之间的矢量， 上边我回复有点问题，三角函数早丢了，计算 (y2-y1) /(x2-x1) 和(y3-y1) /(x3-x1) 是否相等。两个分数分别转化为最简式，通过约分，判断分母是否相等且分子是否相等，相等则无法形成三角形，不等既可以。

user: user-0
content: 引用 1 楼 寻开心的回复:if((x1-x2)*(y2-y3)==(x2-x3)*(y1-y2)) 这么等就是不对的 浮点数的等要用       fabs（它们的差）<1e-12; 长知识了，但是我改掉之后还是不可以的，之前我换成海伦公式算面积，是可以通过的，所以我觉得这个判断相等的地方应该不是关键问题

user: user-0
content: 引用 5 楼 真相重于对错的回复:其实就是求fabs (y2-y1/x2-x1)和 fabs(y3-y1/x3-x1) 是否相等 这个地方我明白了，之前就一直没注意到这点，但是我现在不明白的是求面积的地方为什么不对

user: user-0
content: 怎么单独回复一层的呀。。。

user: user-3
content: 其实就是求fabs (y2-y1/x2-x1)和 fabs(y3-y1/x3-x1) 是否相等

user: user-0
content: 长知识了，但是我改掉之后还是不可以的，之前我换成海伦公式算面积，是可以通过的，所以我觉得这个判断相等的地方应该不是关键问题

user: user-3
content: 三点不共线即可组成三角形，没有必要算距离

user: user-4
content: 逻辑看起来好像没什么问题 printf结束要加\n吧？

user: user-2
content: if((x1-x2)*(y2-y3)==(x2-x3)*(y1-y2)) 这么等就是不对的 浮点数的等要用       fabs（它们的差）<1e-12;
user-0 提问: 编写程序

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 引用 4 楼 qq_45464245 的回复:[quote=引用 2 楼 自信男孩的回复:]一个函数一个函数看，比如如下函数就是判断素数的。 intIsPrime(intn)  这个是判断因子的  voidFactorizePrime(intn) 同学     怎么结算帖子知道吗[/quote] 自己研究一下，如果长期在论坛里讨论问题，建议自己研究一下。

user: user-0
content: 引用 2 楼 自信男孩的回复:一个函数一个函数看，比如如下函数就是判断素数的。 intIsPrime(intn)  这个是判断因子的  voidFactorizePrime(intn) 同学     怎么结算帖子知道吗

user: user-3
content: 是不是那两个break不在同一层循环里？

user: user-2
content: 一个函数一个函数看，比如如下函数就是判断素数的。 intIsPrime(intn)  这个是判断因子的  voidFactorizePrime(intn)

user: user-0
content: 这个程序怎么理解  看不懂
user-0 提问: 编写程序，从键盘输入10个学生的基本情况（学号，姓名，性别及三门课程成绩），存放在结构体数组当中，计算所有同学的总分，并按总分排降序后输出

回复:
user: user-1
content: 作业？应该自己动手完成。

user: user-2
content: #include<stdio.h>  typedef struct student{     int ID;     char name[10];     char sex[2];     float score1,score2,score3;     float sum; }ST;  int main() {      ST s[10],*p;     int i, j;     float sum;     p=s;     printf("输入十个学生信息（姓名，学号，性别，三科成绩）：");      for (i = 0; i<10; i++)     {         //scanf("%s",&p->name);         scanf("%s", p->name);         scanf("%d",&p->ID);         //scanf("%s",&p->sex);         scanf("%s", p->sex);         scanf("%f%f%f",&p->score1,&p->score2,&p->score3);         printf("\n");         p++;   //只想下一个元素     }     printf("continue");     p = s;   //重新指向s     for (i = 0; i<10; i++)     {         sum = (p->score1) + (p->score2) + (p->score3);         p->sum = sum;         p++;     }     //student temp;     printf("continue");     struct student temp;     for (i = 0; i<10 - 1; i++)     {         for (j = 0; j<10 - 1 - i; j++)         {             if (s[j].sum<s[j + 1].sum)             {                 temp = s[j];                 s[j] = s[j + 1];                 s[j + 1] = temp;             }         }     }     printf("成绩排序后：\n");     for (i = 0; i<10; i++)     {         printf("%s,%d,%s,%0.2f\n",s[i].name,s[i].ID,s[i].sex,s[i].sum);     }     return 0; }  供参考～  注意p再输入时要p++,计算总成绩时要p = s;

user: user-3
content: 使用结构体指针，那就是要把结构体变成结构体指针啦  你可以把数组定义成 ST*  s[10]; 读数据的时候  for 循环     ST * p = (ST*) malloc ( sizeof(ST));     s[i] = p;    scanf 数据到 p->score1, p->score2, .....  后面就都类似了   偷懒的办法， 代码当中凡是用到s[i]. 这种语句的地方 都来一个： ST* p = &s[i]; 然后不用s[i]. 操作，都改成 p->操作
user-0 提问: 为什么我觉得vs2017经常报的错误和真正的错误相差万里？

回复:
user: user-1
content: 我也是免费社区版，完全没有你说的情况

user: user-2
content: 感觉还是和语言关系大一点吧，当然IDEA还是智能点
user-0 提问: 【新人求助】printf("%ld\n", sizeof(int * ));在64位的电脑上输出结果，为什么不是8而是4呢

回复:
user: user-1
content: 生成时不看windows系统是多少位的，而是看生成时选取的平台是什么。 如果选32位生成，当然还是32位的

user: user-2
content: sizeof 是在编译时确定的，不是在运行时确定的。

user: user-3
content: 引用 2 楼 寻开心 的回复:windows下 int 和 long int 都是32位的， long long int才是64位的 楼主的是int *.是指针v哦  VC6.0不支持64位系统吧编译器应该是还是32位的。

user: user-4
content: vc6 出生时，64系统还不普及，应该不能够生成64位的程序。

user: user-5
content: windows下 int 和 long int 都是32位的， long long int才是64位的
user-0 提问: 二叉树的序列化与反序列化——二叉树与字符串的转换，超时bug

回复:
user: user-1
content: 这就是一个二叉树的中序遍历过程，再遍历的过程当中，输出或者读取界节点内容  // 输出 void  ioOutput（TreeNode* pTree， FILE* fp ){            输出  pTree->data;            if ( pTree -> left )  ioOutput( pTree->left， fp) ; else 输出 #；            if （pTree->right) ioOutput(pTree->right， fp); else 输出# }  // 读入 TreeNode * ioInput（FILE * fp) {          ElementType data = 读入数据          if ( data  == '#' ) return NULL;          TreeNode * pTree = (TreeNode*) malloc(TreeNode);          pTree->data = data;          pTree->left = ioInput(fp);          pTree->right = ioInput(fp);           return pTree; }

user: user-2
content: "你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。" 这里所说的字符串，并不一定是文字字符串，也可以是二进制的吧。所以你可以省略，文字到数字的转换过程。 另外 char *str = (char*)malloc(sizeof(char) *12);  // char str [12]就行了，二叉树不会太深

user: user-0
content: 换了一种方式写。终于过了，虽然耗时和耗内存比较大。 /**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     struct TreeNode *left;  *     struct TreeNode *right;  * };  */ /** Encodes a tree to a single string. */ void dfs(struct TreeNode *root, char *s); struct TreeNode* de(char* data, int *index, int len); char* serialize(struct TreeNode* root) {     if(root == NULL)         return NULL;     char *re = (char*)malloc(sizeof(char) * 5000);     re[0] = '\0';     dfs(root, re);     return re;    } void dfs(struct TreeNode *root, char *s) {     if(root == NULL)     {         strcat(s, "#");         return;     }     char *str = (char*)malloc(sizeof(char) *12);     sprintf(str, "%d ", root->val);     //itoa(root->val, str, 10);  itoa函数与ANSI标准是不兼容的；     strcat(s, str);     //strcat(s, " ");     free(str);     dfs(root->left, s);     dfs(root->right, s); } /** Decodes your encoded data to tree. */ struct TreeNode* deserialize(char* data) {          if(data == NULL)         return NULL;     int index = 0;     int len = strlen(data);     return de(data, &index, len); } struct TreeNode* de(char* data, int *index, int len) {     //int len = strlen(data);     if((*index) >= len)         return NULL;     if((*index) < len && data[*index] == '#')     {         (*index)++;         return NULL;     }       int flag = 1;     if(data[*index] == '-')     {         flag = -1;         (*index)++;     }      else if(data[*index] == '+')        {         (*index)++;     }     struct TreeNode * root = (struct TreeNode *)malloc(sizeof(struct TreeNode));     root->val = 0;     while((*index) <= len && data[*index] >= '0' && data[*index] <= '9')     {         root->val *= 10;         root->val += (int)(data[(*index)] - '0');         (*index)++;     }     root->val *= flag;     (*index)++;     root->left = de(data, index, len);     root->right = de(data, index, len);     return root; }  // Your functions will be called as such: // char* data = serialize(root); // deserialize(data);
user-0 提问: 提问

回复:
user: user-1
content: 字符串拷贝 把a拷贝给p->name

user: user-2
content: 一个百度就搞定的问题还来论坛提问？这个就是C 的API，一下就知道结果的，无语了

user: user-3
content: 好像是把字符串a的内容复制到结构体成员name中
user-0 提问: 求朋友们帮忙解释一下这个超简单的计算题！！！

回复:
user: user-1
content: 从运算符优先等级的角度出发，结果自然就出来了  单目运算符，双目运算符，括号运算符等等

user: user-2
content: 引用 2 楼 ?Victor.?? 的回复:[quote=引用 1 楼 與蘤舊縐 的回复:] 什么资料，直接放弃吧，void main和连续自增简直就是在挑战程序员的底线，不用纠结了，本来就不能这么做，不同编译器对其理解是不同的 有一事不明，为什么我算出q=22，而不是21呢[/quote]  一个变量一行只能一个++, --, 如果出现多个，写这个代码的人直接烧死祭天即可。

user: user-3
content: 对于有歧义性的表达式不建议写和深入的研究，跟编译器有关系呢。代码的移植性有问题～

user: user-0
content: 不用纠结的话真是太好了蟹蟹

user: user-0
content: 握爪，我也是这样得的答案啊，输进去得的是上面给的答案，苦恼

user: user-4
content: 书里明确说了不能这么做，如果一定要做的话。 p=18 q=21 i=8 j=8

user: user-5
content: 引用 2 楼 ?Victor.??的回复:[quote=引用 1 楼 與蘤舊縐 的回复:] 什么资料，直接放弃吧，void main和连续自增简直就是在挑战程序员的底线，不用纠结了，本来就不能这么做，不同编译器对其理解是不同的 有一事不明，为什么我算出q=22，而不是21呢[/quote] 都说了编译器不一样答案不一样，天知道他是什么见鬼的逻辑

user: user-6
content: 引用 1 楼 與蘤舊縐 的回复:什么资料，直接放弃吧，void main和连续自增简直就是在挑战程序员的底线，不用纠结了，本来就不能这么做，不同编译器对其理解是不同的 有一事不明，为什么我算出q=22，而不是21呢

user: user-5
content: 什么资料，直接放弃吧，void main和连续自增简直就是在挑战程序员的底线，不用纠结了，本来就不能这么做，不同编译器对其理解是不同的
user-0 提问: 结构体别名 和 结构体名字一样会有问题吗？

回复:
user: user-1
content: 不建议，当你用别名定义了一个数组的时候，例如这样typedef struct fish{int weight;}fish[100]； fish kano;这时候用vs就会报错

user: user-2
content: 最好自己试一试，这样可能更直观的理解和验证～

user: user-2
content: 没问题，但是不建议这么做。起别名就是考虑不一样的名字，提高代码的可读性。

user: user-3
content: 做工程的时候 为了规范 一般别名都是结构体的名字加上_t 比如说名字是list 别名就是list_t 这样是表示是用typedef取的别名 同理你经常会看见int32_t int16_t之类的名字

user: user-4
content: 加个typedef其实不过是为了修改方便，另外可以取多个别名，fish，*pfish……

user: user-4
content: 为什么要别名呢，其实很简单  如果没有别名，那么定义的时候类型就是struct fish，如果有别名，类型就是fish，短了点
user-0 提问: C 指针和数组入门问题

回复:
user: user-1
content: 编译不过吧

user: user-2
content: 先取值，地址后移一次

user: user-3
content: 首先，ptr=&sz就错了，数组名就是指针，还对指针取地址，肯定是错的，应该把取地址符去掉才行。执行完这条语句之后，ptr就指向了数组的第一个元素的地址，那么ptr++的意思是用完之后再加一，意思就是先*ptr再ptr加1。比如说ptr现在指向第0个元素，那么先输出第0个元素，下次就输出第一个元素。还不懂去我的主页看看我写的指针的文章

user: user-4
content: 楼主你的编译器挺神奇啊！估计是我的编译器版本太新了。我这边ptr1=&sz;是肯定报错的 我们一般都这么写：ptr1=&sz[0];

user: user-5
content: *ptr1++先解引用后增量 *++ptr1先增量后解引用

user: user-6
content: 指向下一个数组元素

user: user-7
content: 引用 23 楼 luj_1768 的回复:*ptr1++先不说。先说说ptr1=&sz; 这个表达式在早初是可以在vc60通过的，后来忽然就报错了。可能推荐这样赋值：*ptr1=sz; 看好了吧？类型匹配避开了指针与引用的复杂性，都是double 类型。一般数组和指针是同构的，只是指针比较便于表示非正则数据。 你这个*ptr1=sz 就是直接错误  更不靠谱

user: user-8
content: 引用 29 楼 xiaoxiangqing 的回复:*ptr1++-->*的优先级高，所以是先*ptr,再++++优先级高

user: user-9
content: *ptr1++-->*的优先级高，所以是先*ptr,再++

user: user-10
content: 引用 15 楼 Cedar_Guo的回复:++优先级虽然高于*,但是++属于右结合型。所以先进行取值，然后地址再加一，指向下一个数组元素 它两个的优先级不是一样的吗？

user: user-11
content: 遇到这种类似问题，能编译的话自己单步运行一下，理解会更深一点

user: user-12
content: *ptr1++，在这里可以改写为：ptr1[i]。差异是循环后ptr1指针内容不变，但可读性应该要高一些。

user: user-13
content: 指针的移动，先访问第一个元素，i=1，i<5成立 继续访问下一个元素，以此类推直到i<5不成立。最后打印输出。

user: user-14
content: 楼主，你的编译器不靠谱呀！应该使用C-FREE5.0 编译器。      我用C-FREE5.0 编译器编译后发现是错误的。      把 ptr1=&sz;  修改为 ptr1=sz;  编译通过

user: user-15
content: 首先前面ptr1=&sz就错了，指针其实就是存储数据的一个地址，&是取地址运算符，而数组名其实就是数组首元素的地址，即&sz[0]==sz

user: user-16
content: 引用 16 楼 lin5161678 的回复: 好烦哦，你看看我在 7 楼说的好吧，我第二次评论只是想提醒楼主不要过分纠结环境。 哪来的这么多杠精啊？有脑子不？

user: user-17
content: printf("%.2lf \n",*ptr1);  ptr++;

user: user-18
content: ``` hello ```

user: user-19
content: 不是*ptr1++，是ptr1++吧，这个指针ptr1指的是头地址（就是sz[0]）后面的++就是循环一次加一次，地址往后移，这样就可以依次把sz[0]，sz[1]，sz[2]…直到循环结束

user: user-8
content: 引用 13 楼 关于0318 的回复:[quote=引用 12 楼 u012538549 的回复:] 一方面有的同学学习 c 语言可能就是学校的一门课程，跟将来就业没关系； 另一方面，如果刚学习就在 linux 环境的话，还是有点困难的，也没必要。 codeblock 虽然在正经生产环境不怎么用，但是学习还是可以的。 楼主只要下载正经的版本就可以了，切记不要一开始对自己太苛刻，步步为营 => 寸步难行。 [/quote] 指针类型不匹配就是错 哪来这么多歪理 C里面是一个警告  C++直接Error糊你一脸 哪个老师说这样做没问题  那就是误人子弟
user-0 提问: 麻烦大佬帮忙看看

回复:
user: user-1
content: 不可以吧，s没有指向吧

user: user-2
content: 不可以，野指针。结果未定义，即结果可能正常，也可能出现段错误。  建议把char *s = NULL;初始化

user: user-3
content: 引用 2 楼 ?Victor.?? 的回复:指针指向字符串，可以呀 对，你还要搞一个数组

user: user-3
content: 指针指向字符串，可以呀

user: user-4
content: s没有指向任何位置，gcc下打印结果为null，但其他编译器下可能报错，这么干没啥意义
user-0 提问: 小白学c语言，请问各路大神这两道题怎么写程序

回复:
user: user-0
content: 引用 12 楼 寻开心 的回复:用getchar（）达不到要求，因为你输入什么就显示什么 getch（）可以做到， 因为你输入什么它都不显示 可以运行了，虽然跟自己想的不太一样，感谢老哥的指导！

user: user-1
content: 用getchar（）达不到要求，因为你输入什么就显示什么 getch（）可以做到， 因为你输入什么它都不显示

user: user-1
content: if(ch-'0'>=0&&ch-'0'<=9) {            putchar(ch);             putchar('\n');         } else           putchar('erro');              }

user: user-1
content: while ( (ch =getch()) != EOF ) {         if ( ch>= '0' && ch <= '9' ) putchar(ch); };

user: user-0
content: 引用 6 楼 寻开心 的回复:第一个题做到挺好的啦 ，你那个担心可以稍微改一下， 让用户输入x和z两个就可以了，反正y是计算输出的  第二个题继续自己做 #include <conio.h> 然后 char ch = getch（）利用这个函数，可以获得用户的键盘输入但是不显示，其他都可以自己来了这是第二个题，但是if else 好像不匹配，大神帮忙看看问题出在哪，感谢！

user: user-1
content: getch()函数是一个不回显函数，当用户按下某个字符时，函数自动读取，无需按回车

user: user-0
content: 引用 6 楼 寻开心 的回复:第一个题做到挺好的啦 ，你那个担心可以稍微改一下， 让用户输入x和z两个就可以了，反正y是计算输出的  第二个题继续自己做 #include <conio.h> 然后 char ch = getch（）利用这个函数，可以获得用户的键盘输入但是不显示，其他都可以自己来了#include<stdio.h> int main()  {     char ch;     ch=getchar();     if(ch-'0'>=0&&ch-'0'<=9)	            putchar(ch);             putchar('\n');         else           putchar('erro');              }

user: user-1
content: 第一个题做到挺好的啦 ，你那个担心可以稍微改一下， 让用户输入x和z两个就可以了，反正y是计算输出的  第二个题继续自己做 #include <conio.h> 然后 char ch = getch（）利用这个函数，可以获得用户的键盘输入但是不显示，其他都可以自己来了

user: user-0
content: 引用 2 楼 寻开心 的回复:x小于0，y=x-10； 看x是多少了 x等于0 ，y=y+3； 就是 5； x大于0， y=z； 就是2；  y的结果就要看x输入什么了感觉老师的意思是z和y不赋值，满足条件直接输出就行

user: user-0
content: 引用 1 楼 寻开心 的回复:你的题在哪儿呢， 光有这代码题在这，不好意思我把我写的发上来了

user: user-0

user: user-1
content: x小于0，y=x-10； 看x是多少了 x等于0 ，y=y+3； 就是 5； x大于0， y=z； 就是2；  y的结果就要看x输入什么了

user: user-1
content: 你的题在哪儿呢， 光有这代码
user-0 提问: 一个不是数学问题的数学问题

回复:
user: user-0
content: 引用 6 楼 與蘤舊縐 的回复:主要还是用来配合一下markdown语法，写点东西 Markdown是一种可以使用普通文本编辑器编写的标记语言，通过简单的标记语法，它可以使普通文本内容具有一定的格式。 Markdown具有一系列衍生版本，用于扩展Markdown的功能（如表格、脚注、内嵌HTML等等），这些功能原初的Markdown尚不具备，它们能让Markdown转换成更多的格式，例如LaTeX，Docbook。Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具，如Pandoc；要么基于网站，如GitHub和Wikipedia，在语法上基本兼容，但在一些语法和渲染效果上有改动。 是这东西吗？

user: user-1
content: 主要还是用来配合一下markdown语法，写点东西

user: user-0
content: 引用 4 楼 與蘤舊縐 的回复:去学一下latex吧，各路奇奇怪怪的符号都能念了 LaTeX（LATEX，音译“拉泰赫”）是一种基于ΤΕΧ的排版系统，由美国计算机学家莱斯利·兰伯特（Leslie Lamport）在20世纪80年代初期开发，利用这种格式，即使使用者没有排版和程序设计的知识也可以充分发挥由TeX所提供的强大功能，能在几天，甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式，这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。这个系统同样适用于生成从简单的信件到完整书籍的所有其他种类的文档。 是这东西吗？

user: user-1
content: 去学一下latex吧，各路奇奇怪怪的符号都能念了

user: user-0
content: 引用 2 楼 user-2 的回复:念 派 吧，表示连乘积（几个数连乘） 谢谢，原来是派大写了

user: user-2
content: 念 派 吧，表示连乘积（几个数连乘）

user: user-0
user-0 提问: 一个指针方面的小问题

回复:
user: user-1
content: 发现问题可以从根源上找找 也就是说你可以试试从地址上查找俩者的区别

user: user-0
content: 已验证，就是如 7 9 楼大佬说的那样，问题已解决，感谢7、9楼和其他各位大佬！

user: user-2
content: 引用 2 楼 关于0318 的回复:版本是这个：gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 越界是指哪里？  如果第七行放在第六行前，那么输出就只有一个 “1”， 如果第六行放在第七行前，每次执行的输出不一样。  越界是说 char *p = &a; *(p+2) = '2'; //越界是指这里 *(p+1) = '\0';//和这里，因为这里的内存不是a的了 a的内存空间之后可能是p的内存空间（或者反过来，要看编译器了，这是方法栈给局部变量分配的空间），p是个指针变量，也有自己的内存空间，你可以打印 printf("%p %p\n", &a, &p); //看看它们的地址 如果p在a之后，那么*(p+2) = '2', *(p+1) = '\0'就覆盖了指针的信息(指针是4个字节)，那样只是修改了p的内存信息，对程序影响不到（只是p的信息不再是a的地址），所以能正常打印（打印结果也应该是确定的，就是1） 但如果p在a之前，那a以后的内存可能就不可预知了，所以可能导致运行不正常

user: user-3
content: 多个局部变量在内存当中的地址关系，因编译器不同而不同， 不具有普遍性 所以基于这种地址关系假设的写法都没有可移植性，尽量避免这么去写

user: user-3
content: int main(){   char a = '1';   char *p = &a;   *(p+2) = '2';   *(p+1) = '\0';  首先第六第七行都是属于指针越界操作 p取的是a的地址， p+1就是相邻a地址的下一个地址，下一个地址已经不是a了，a也不是数组，所以p+1和p+2都跑到a的外面了  其次，关于六和七行顺序颠倒后结果不同的问题 局部变量a和p都是在系统栈里面分配的， a和p谁在高地址不一定，要看编译器 如果p的地址比a的地址高， p指向a，p+1和p+2很可能就指向了p变量所在地地址 那么第六行操作，会改变p指针自身的值， 再执行第七行的时候，p已经不原来的p了 第六和第七交换，因为对p的改变不同，所以结果不同  你可以如下测试 p = &a;  printf("Address a:%p Address p:%p\n", p, &p); 执行完第六行和第七行，之后，你再次输出printf("%p\n");就可以看到p指针的变化了

user: user-4
content: 你这个是非法操作，啥结果都正常

user: user-5
content: 引用 4 楼 关于0318 的回复:[quote=引用 3 楼 user-5 的回复:] 我没有安装gcc我用vs试没有问题，具体原因，你想知道，可以在每一步执行之后把这段内存中的数据都显示一次看看变化。  你说的 vs 不会是 vscode 吧[/quote] Visual Studio 2010 c++

user: user-0
content: 引用 3 楼 user-5 的回复:我没有安装gcc我用vs试没有问题，具体原因，你想知道，可以在每一步执行之后把这段内存中的数据都显示一次看看变化。  你说的 vs 不会是 vscode 吧

user: user-5
content: 我没有安装gcc我用vs试没有问题，具体原因，你想知道，可以在每一步执行之后把这段内存中的数据都显示一次看看变化。

user: user-0
content: 引用 1 楼 user-5 的回复:你用的是什么编译的，这个输出应该是一样的，虽然你越界操作了 版本是这个：gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 越界是指哪里？  如果第七行放在第六行前，那么输出就只有一个 “1”， 如果第六行放在第七行前，每次执行的输出不一样。

user: user-5
content: 你用的是什么编译的，这个输出应该是一样的，虽然你越界操作了
user-0 提问: windows串口接收过程中拔掉的识别和处理(C/C++)

回复:
user: user-0
content: 引用 2 楼 scitachi 的回复:[quote=引用 1 楼 轻箬笠 的回复:] 楼主可以看下这位的回复。 https://bbs.csdn.net/topics/392297287 [quote=引用 3 楼 躺着睡的蜗牛 的回复:] 写下我曾经的一个做法  串口10ms读一次数据。  如果数据读取失败，并且GetLastError()返回值不为ERROR_SUCCESS和ERROR_IO_PENDING时， 错误计数加1。 当错误计数超过20时，设置串口为断开状态。 如果错误计数小于20并且读取数据成功时， 削除错误计数。  如果是usb相关的，可以考虑处理WM_DEVICECHANGE[/quote]  感谢回复。 不过这种做法貌似是默认不会存在隔很久才接收到一次数据的情况吧？ 假如十几分钟后才来一条数据，实际并没有断线，是不是也视为了断开？[/quote]  不好意思，理解好像有点错误。 如果断开连接，输入缓冲区里的数据还正常么？ 用ClearCommError 是不是就读不出来有多少数据了？

user: user-0
content: 引用 1 楼 轻箬笠 的回复:楼主可以看下这位的回复。 https://bbs.csdn.net/topics/392297287 [quote=引用 3 楼 躺着睡的蜗牛 的回复:] 写下我曾经的一个做法  串口10ms读一次数据。  如果数据读取失败，并且GetLastError()返回值不为ERROR_SUCCESS和ERROR_IO_PENDING时， 错误计数加1。 当错误计数超过20时，设置串口为断开状态。 如果错误计数小于20并且读取数据成功时， 削除错误计数。  如果是usb相关的，可以考虑处理WM_DEVICECHANGE[/quote]  感谢回复。 不过这种做法貌似是默认不会存在隔很久才接收到一次数据的情况吧？ 假如十几分钟后才来一条数据，实际并没有断线，是不是也视为了断开？

user: user-1
content: 楼主可以看下这位的回复。 https://bbs.csdn.net/topics/392297287 引用 3 楼 躺着睡的蜗牛 的回复:写下我曾经的一个做法  串口10ms读一次数据。  如果数据读取失败，并且GetLastError()返回值不为ERROR_SUCCESS和ERROR_IO_PENDING时， 错误计数加1。 当错误计数超过20时，设置串口为断开状态。 如果错误计数小于20并且读取数据成功时， 削除错误计数。  如果是usb相关的，可以考虑处理WM_DEVICECHANGE
user-0 提问: 大佬们，本人大一菜鸡，最近作业完成吃紧，写了个代码，却不知道为何运行错误，烦请那位大佬能够解疑答惑，小弟感激涕零

回复:
user: user-1
content: 代码还没贴全，你的问题是什么。

user: user-2
content: 兄弟，你这个C语言程序复杂呀！