好久不看 c 了,麻烦看一个考研题……

2016-12-09 00:59:13 +08:00
 SorryChen
做了半天没做出来……
https://imgur.com/a/tqaIy
谢过了

刚躺在床上貌似就想出来了!
3979 次点击
所在节点    C
39 条回复
SorryChen
2016-12-09 11:48:36 +08:00
@muziki 应该是没问题的……你可能哪里想错了
SorryChen
2016-12-09 11:52:29 +08:00
@SpicyCat 就是这样,同学考同济啊中科大的专业课也不是特别难,关键还是看公共课
harry890829
2016-12-09 11:52:59 +08:00
@SorryChen 哎,我最近还在想,找个时间把高数那一套重新学起来呢
muziki
2016-12-09 12:00:46 +08:00
@SorryChen 在代码里面除了 s2 遍历到结尾和 while(*p0)完成的时候,没有对字符串做别的操作啊。能说下我哪里想错了吗? 代码写出来调试运行也没成功
wwbfred
2016-12-09 12:16:45 +08:00
这题难度不大不代表所有学校的所有题都这难度.
并且上考场和你平时做着玩可不是一回事.
别犯盲人摸象的错误.
觉得简单的可以去搞 408 和高数.
大学学的怎么样分分钟见原形.
SorryChen
2016-12-09 12:21:35 +08:00
@muziki 这段代码对字符串进行操作的语句其实是*p1++=*p0 是比较隐蔽的修改,因为 p0p1 这两个指针指的其实就是 s1 这块内存空间里面的字符, if 中的语句就表示当前 p0 所指字符,不是要删掉的,也就是要保留的,将这个字符,赋值给 p1 所指那块内存空间,然后 p1 向后移动一个,也就是说 p1 所指位置前面的所有字符,都是要保留下来的,最后在外面 p1 所指位置加上一个结束符,衣服穿就结束了。总体思想就是 p0 去后面找,然后不断覆盖 p1 位置, p1 向后移动,循环往复,最终结束之后 p1 位置加一个结尾,就好了
SorryChen
2016-12-09 12:23:58 +08:00
@wwbfred 高数是真头疼,我们学校专业好像没 408 的,准备的比较晚,只敢报个考 C 的😂😂😂
vuser
2016-12-09 12:50:35 +08:00
@muziki
char s1[13] = "abcaa63akdfk";
char s2[5] = "ayk5";
ramen
2016-12-09 13:26:03 +08:00
这题太容易钻空子了。根本不用看懂程序。
首先 p0,p1 都是跟 s1 相关的,所以 p2 必然要跟 s2 关联起来。
所以,第一个空应该是 s2.
while 循环的条件是 p0,所以循环内应该有 p0 的增加操作,所以第二个空是 p0++。
前面替换操作完成后,必然要设返回值。这函数没返回值,那肯定直接要改参数 s1 ,而本身 p1=s1 ,所以替换完成后增加一个结束符是必要的。
于是第三个空就是\0 了
xiaolingxinna
2016-12-09 13:49:22 +08:00
void func(char* s1, char* s2){
char *p0, *p1, *p2;
p0=p1=s1;
while(*p0){
p2=_________;
while(*p2 && ( *p0 != *p2 )){
p2++;
}
if(*p2=='\0'){
p1=p0;
p1++;
}
____________;
}
p1=_____________;
}
附上能看的格式。 xjb 缩进,不加花括号,真做工程像出题的那么写会被打死吧。
SorryChen
2016-12-09 14:22:43 +08:00
@xiaolingxinna 基本每一道题的写法,放在工程都会被打死……
Cu635
2016-12-09 14:57:59 +08:00
@chiu
@harry890829
@lenjeans
@wwbfred
@icedx
各位,先搞明白研究生考试是干什么的再来评价考题的难度。。。
研究生入学考试其实重点是后面的复试。

至于初试,其实考的并不是你的知识,而是你的身体素质:一场考试 3 个小时,一天两场之间中午只有不到 2 个小时的休息时间,而且考题又是那种又累人分值又小数量又多的那种,那不是考验你的脑力劳动方面的体力是啥?哦,初试你连两天这种高强度的脑力劳动都坚持不下来考不出好成绩,研究生更累。

所以说你看,初试的分数线看起来并不高,甚至只是折算成百分制的及格线附近甚至更低。
Cu635
2016-12-09 14:59:17 +08:00
@wyntergreg
@Pan940425
反而是落枕了吧,治颈椎病得是一会儿左一会儿右,这几张图都是一个方向最后的结果就是落枕。。。
deeporist
2016-12-09 15:09:57 +08:00
'''
#include <stdio.h>

int main()
{
char sa[]="abcaa63akdfk";
char sb[]="ayk5";

void fun(char *,char *);
printf("%s\n%s\n",sa,sb);
fun(sa,sb);
printf("%s\n%s\n",sa,sb);
return 0;
}

void fun(char *s1,char *s2)
{
char *p0,*p1,*p2;
p0=p1=s1;
char c=0;
while(*p0)
{
p2=s2;
while(*p2 && (*p0!=*p2))
p2++;
if(*p2=='\0')
*p1++=*p0;
p0++;
}
*p1='\0';
}
'''
win8.1 cygwin gcc 编译成功运行成功结果无误 gdb 完全调试
ps :我一开始把那两字符串声明成了指针类型(char *sa="abcaa63akdfk") 然后 segmentation fault 了一下午..........神 tmC 陷阱白看了 我今年也报了名我看我还是先去面壁比较好
SorryChen
2016-12-09 15:33:29 +08:00
@deeporist 哈哈这个错误我也犯过
zscself
2016-12-09 15:55:41 +08:00
@SorryChen 你这专业课是叫“数据结构”还是叫“ C 语言”?
SorryChen
2016-12-09 16:02:36 +08:00
@zscself 其实是叫高级程序设计,其实就是 c 语言,考一点简单算法
peneazy
2016-12-09 19:20:25 +08:00
早知道五年前考计算机研究生了,因为公费读本专业硕士,就读了三年。。发了多篇 EI ,可惜没什么卵用,转行前端了
ghSimon
2017-01-21 20:03:22 +08:00
所以这个问题的实质是在于对形参 char *的内存分配位置的理解?需要先拷贝一份到 char[],然后才能实现写操作,避免段错误?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/326314

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX