LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 873|回复: 11

问使用sscanf的问题。

[复制链接]
发表于 2003-10-6 22:21:06 | 显示全部楼层 |阅读模式
目的是获取键盘的输入,要求pS->name pS->address pS->tel分别不超过12 25 12个字符,前面的XXXX应该怎么写?

  1. sscanf (XXXX, "%12s%25s%12s", pS->name, pS->address, pS->tel);
复制代码
 楼主| 发表于 2003-10-6 22:26:55 | 显示全部楼层
或者说,使用什么函数可以达到目的?
 楼主| 发表于 2003-10-6 22:34:54 | 显示全部楼层
刚才man了一下,知道sscanf是从字符串中读入数据,所以在这里不能直接用了,那么我该用函数呢?
发表于 2003-10-6 22:50:20 | 显示全部楼层
获取键盘输入可以用scanf,不过象你这个要求好像不好办,最好是直接获取全部输入,再按分隔符分成字段,再按大小截取。
 楼主| 发表于 2003-10-6 22:54:50 | 显示全部楼层
我是用scanf 的,不过,如果输入的字符过多,就会出现溢出。
发表于 2003-10-6 23:13:03 | 显示全部楼层
fread buf
sscanf buf

或是把stdin关联到某个buffer(看看文件操作那块 我忘记了 有一个函数可以把FD关联到组冲区形式)
发表于 2003-10-6 23:13:26 | 显示全部楼层
如查清想查那就使用fread 再分析吧
 楼主| 发表于 2003-10-6 23:17:37 | 显示全部楼层
是啊,只能这样了(还有一个办法,获取后先放在一个字符数组中,再拷贝过去也行),不过实现起来麻烦点。
发表于 2003-10-6 23:38:19 | 显示全部楼层
处理输入确实麻烦,我大概写了一个函数,你可以看看:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int
  4. getfield(char *s, int len)
  5. {
  6.   char c;
  7.   int n = 0;
  8.   
  9.   c = getchar();
  10.   while(isspace(c)) /* 略去前面的空白 */
  11.     c = getchar();
  12.   while(!isspace(c) && n < len){ /* 获取输入,不超过指定长度 */
  13.     s[n++] = c;
  14.     c = getchar();
  15.   }
  16.   if(n == len){ /* 略去多余的输入 */
  17.     c = getchar();
  18.     while(!isspace(c))
  19.       c = getchar();
  20.   }
  21.   s[n] = '\0';
  22.   return(n);
  23. }

  24. int
  25. main(void)
  26. {
  27.   char name[13], addr[26], tel[13];

  28.   getfield(name, 12);
  29.   getfield(addr, 25);
  30.   getfield(tel, 12);
  31.   printf("name: %s\naddr: %s\n tel: %s\n", name, addr, tel);

  32.   exit(0);
  33. }
复制代码
发表于 2003-10-7 00:37:08 | 显示全部楼层
我觉得不必这么繁琐,好好研究一下库函数,就会有新发现。
下面的代码即简单又安全。

  1. #include <stdio.h>

  2. /* 定义结构体数据类型 */
  3. typedef struct ps {
  4.         char name[13];  /* 注意要多留一个空位 */
  5.         char address[26];
  6.         char tel[13];
  7. } PS;

  8. int main ()
  9. {
  10.         PS pS;
  11.         
  12.         /* %*s 表示忽略多余的输入字符 */
  13.         printf("Please input name: ");
  14.         scanf("%12s %*s", pS.name);

  15.         printf("\nPlease input address: ");
  16.         scanf("%25s %*s", pS.address);

  17.         printf("\nPlease input telphone: ");
  18.         scanf("%12s %*s", pS.tel);

  19.         printf( "\n%s %s %s\n", pS.name, pS.address, pS.tel );

  20.         return 0;
  21. }
复制代码

或者

  1. #include <stdio.h>

  2. /* 定义结构体数据类型 */
  3. typedef struct ps {
  4.         char name[13];  /* 注意要多留一个空位 */
  5.         char address[26];
  6.         char tel[13];
  7. } PS;

  8. int main ()
  9. {
  10.         PS pS;
  11.         
  12.         /* %*s 表示忽略多余的输入字符 */
  13.         printf("Please input name: ");
  14.         fscanf(stdin, "%12s %*s", pS.name);

  15.         printf("\nPlease input address: ");
  16.         fscanf(stdin, "%25s %*s", pS.address);

  17.         printf("\nPlease input telphone: ");
  18.         fscanf(stdin, "%12s %*s", pS.tel);

  19.         printf( "\n%s %s %s\n", pS.name, pS.address, pS.tel );

  20.         return 0;
  21. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表