做了一个非常之简单的小编程题,可是十个测试点总有一个不能通过,
,于是种种调试测试,经过五个小时的奋战,终于找到了错误所在。
- 【问题描述】
- 输入两行字符串s和t(s和t可以含空格,length(t)≤length(s)≤50),将s串中首次与t匹配的子串逆置,并将处理后的s串输出。
- 【输入形式】
- 输入文件为当前目录下的invertsub.in。文件中有两行字符串s和t,分别以换行符作为结束符,其中换行符可能是Linux下的换行符,也可能是Windows下的换行符。
- 【输出形式】
- 输出文件为当前目录下的invertsub.out。输出文件只有一行,包含一个串,为要求的输出结果。行末要输出一个回车符。
- 【输入样例】
- helloworld
- llowor
- 【输出样例】
- herowollld
注:测试点我也不知道,谁要是能教教我怎么进入那个debian-Apache服务器的话,我就能搞到了。。。
蛋疼的小错误啊。。。浪费我这么多时间。。。啊啊啊。。。
=====================================================================================
为了彻底搞清楚这件事,做了几组测试:(ubuntu+emacs)
1、fputs一个字符串会是什么?
- #include<stdio.h>
- int main(void) {
- FILE *fp;
- char s[50];
- int i;
- for (i = 0; i < 50; i++)
- s[i] = 'z';
- fp = fopen("test", "w");
- fputs("abcdefg", fp);
- fclose(fp);
- fp = fopen("test", "r");
- fgets(s, 50, fp);
- fclose(fp);
- return 0;
- }
调试结果:
- (gdb) p s
- $1 = 'z'
- (gdb) p s
- $2 = "abcdefg\000", 'z'
2、用vim编辑test,写入abcdefg,不打回车
看输出:
- (gdb) p s
- $1 = "abcdefg\n\000", 'z'
3、当数组s不够长时,会发生什么呢
令s长度为3,继续上个测试
4、fpus( )一个字符数组怎么样
4.1令s 为 zzz ,没有'\n',没有 '\0'
t长度为50,符初值'z',便于分析,足够容量
- fputs(s, fpin);
- fgets(t, 50, fpout);
调试结果
- (gdb) p s
- $1 = "zzz"
- (gdb) p t
- $2 = 'z'
也就是说,没有写入'\n'和 '\0'
4.2令s为zz加上一个'\0'
- (gdb) p s
- $1 = "zz"
- (gdb) p t
- $2 = "zz\000", 'z'
4.3令s为zz加上一个'\n'
- (gdb) p s
- $1 = "zz\n"
- (gdb) p t
- $2 = "zz\n\000", 'z'
总结:
fgets( ):会自动在字符数组最后加上一个'\0',如果字符数组长度不够,则截断前面部分,没有'\0'
如果行尾有换行符,换行符也被赋值进入数组,在'\0'的前面
fputs( ):传入字符串和传入字符数组效果相同,只要元素相同,字符数组后面多加一个'\0',还是一样
但这和用编辑器手动写入一个字符串不同,编辑器会在行尾加上'\n',即使你没有按回车
这与用fputs( )写入字符数组(带有'\n')是一样的。
?????疑问:
我查资料说,fputs( )会自动在行尾加上一个换行符,不管数组中有没有换行符,但我测试的结果不是这样啊
比如我的4.1 和4.2还有4.3,怎么就没有自动多上一个'\n'?
呵呵,现丑了,写的有些乱,有人知道答案么?若能指教,感激涕零。
阅读(14760) | 评论(1) | 转发(1) |