Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181894
  • 博文数量: 48
  • 博客积分: 262
  • 博客等级: 入伍新兵
  • 技术积分: 327
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-10 16:37
文章分类

全部博文(48)

文章存档

2012年(46)

2011年(2)

分类: C/C++

2012-03-29 09:18:01

做了一个非常之简单的小编程题,可是十个测试点总有一个不能通过,,于是种种调试测试,经过五个小时的奋战,终于找到了错误所在。


  1. 【问题描述】
  2. 输入两行字符串s和t(s和t可以含空格,length(t)≤length(s)≤50),将s串中首次与t匹配的子串逆置,并将处理后的s串输出。
  3. 【输入形式】
  4. 输入文件为当前目录下的invertsub.in。文件中有两行字符串s和t,分别以换行符作为结束符,其中换行符可能是Linux下的换行符,也可能是Windows下的换行符。
  5. 【输出形式】
  6. 输出文件为当前目录下的invertsub.out。输出文件只有一行,包含一个串,为要求的输出结果。行末要输出一个回车符。
  7. 【输入样例】
  8. helloworld
  9. llowor
  10. 【输出样例】
  11. herowollld
注:测试点我也不知道,谁要是能教教我怎么进入那个debian-Apache服务器的话,我就能搞到了。。。

蛋疼的小错误啊。。。浪费我这么多时间。。。啊啊啊。。。
=====================================================================================

为了彻底搞清楚这件事,做了几组测试:(ubuntu+emacs)

1、fputs一个字符串会是什么?

点击(此处)折叠或打开

  1. #include<stdio.h>

  2. int main(void) {
  3.         FILE *fp;
  4.         char s[50];
  5.         int i;
  6.         for (i = 0; i < 50; i++)
  7.                 s[i] = 'z';

  8.         fp = fopen("test", "w");
  9.         fputs("abcdefg", fp);
  10.         fclose(fp);

  11.         fp = fopen("test", "r");
  12.         fgets(s, 50, fp);
  13.         fclose(fp);

  14.         return 0;
  15. }
调试结果:

点击(此处)折叠或打开

  1. (gdb) p s
  2. $1 = 'z'

  3. (gdb) p s
  4. $2 = "abcdefg\000", 'z'
2、用vim编辑test,写入abcdefg,不打回车
看输出:

点击(此处)折叠或打开

  1. (gdb) p s
  2. $1 = "abcdefg\n\000", 'z'
3、当数组s不够长时,会发生什么呢
令s长度为3,继续上个测试

点击(此处)折叠或打开

  1. (gdb) p s
  2. $2 = "abc"
4、fpus( )一个字符数组怎么样

      4.1令s 为 zzz ,没有'\n',没有 '\0'
            t长度为50,符初值'z',便于分析,足够容量
           

点击(此处)折叠或打开

  1. fputs(s, fpin);

  2. fgets(t, 50, fpout);
调试结果

点击(此处)折叠或打开

  1. (gdb) p s
  2. $1 = "zzz"
  3. (gdb) p t
  4. $2 = 'z'
也就是说,没有写入'\n'和 '\0'

            4.2令s为zz加上一个'\0'

点击(此处)折叠或打开

  1. (gdb) p s
  2. $1 = "zz"
  3. (gdb) p t
  4. $2 = "zz\000", 'z'
             4.3令s为zz加上一个'\n'

点击(此处)折叠或打开

  1. (gdb) p s
  2. $1 = "zz\n"
  3. (gdb) p t
  4. $2 = "zz\n\000", 'z'

总结:
fgets( ):会自动在字符数组最后加上一个'\0',如果字符数组长度不够,则截断前面部分,没有'\0'
              如果行尾有换行符,换行符也被赋值进入数组,在'\0'的前面
fputs( ):传入字符串和传入字符数组效果相同,只要元素相同,字符数组后面多加一个'\0',还是一样
              但这和用编辑器手动写入一个字符串不同,编辑器会在行尾加上'\n',即使你没有按回车
               这与用fputs( )写入字符数组(带有'\n')是一样的。

?????疑问:
      我查资料说,fputs( )会自动在行尾加上一个换行符,不管数组中有没有换行符,但我测试的结果不是这样啊
    比如我的4.1 和4.2还有4.3,怎么就没有自动多上一个'\n'?

呵呵,现丑了,写的有些乱,有人知道答案么?若能指教,感激涕零。



阅读(14775) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

wangzhione2014-05-30 16:45:29

和楼主一样,对fputs输出的结果产生迷惑.
原来以为fputs会自动加上'\n',但是程序的最终结果没有加上,估计是人们错误的将puts类比fputs吧.
下面是我查到关于fputs的声明
fputs function
 
Purpose:
Writes a string to a stream.

Syntax:
int fputs(const char * restrict string, FILE * restrict stream); 

Declared in:
<stdio.h>

Description:
The fputs function writes the string pointed to by string to the stream pointed to by