Chinaunix

标题: C语言如何截取字符串的后几位值赋给另一个变量 [打印本页]

作者: xike2002    时间: 2012-12-03 17:48
标题: C语言如何截取字符串的后几位值赋给另一个变量
本帖最后由 xike2002 于 2012-12-03 17:50 编辑

char a[21] = "12345678901234567890";
我想把后16位赋给变量char b[17];
也就是说让char b = "5678901234567890"
如何实现啊?
作者: fenghw8088    时间: 2012-12-03 17:59
strcpy(b, a+4);
作者: xike2002    时间: 2012-12-03 18:08
回复 2# fenghw8088
这样不行啊,strcpy()是把一个变量的值赋给另一个变量,strcpy(b,a+4)中的a+4是什么啊?

   
作者: xike2002    时间: 2012-12-03 18:27
高手们,请大家说说啊,我正在调试一个程序,在线等?
作者: Sevk    时间: 2012-12-03 18:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: folklore    时间: 2012-12-03 18:36
楼主也是从Java来的么,网上找一找C语言入门看一下比较好

@Sevk
你要说memcpy(b,a+strlen(a)-sizeof(b)+1,17); 他就懂了。
作者: zighouse    时间: 2012-12-03 18:37
better  substitute strcpy with strncpy.
作者: xike2002    时间: 2012-12-03 18:40
我试了不行啊,a和b都是定义的结构体中的变量,类型为char。
这样写感觉是没有语法错误,但是执行结果的时候提示段错误。
作者: zighouse    时间: 2012-12-03 18:42
sizeof(char) is 1, how can you put so much thing into a byte? think it over!
作者: xike2002    时间: 2012-12-03 18:51
回复 9# zighouse
字符串可以定义它的长度吧,我定义的是char a[21] = "12345678901234567890"

下面是我的代码



下面是我的执行结果



明显不对啊

代码中的keyInfo[k]->buffmodName是我的字符串a,checkTerminal->arg0是我的字符串b,
我的目的就是把a中除去前四位后剩下的值赋给b。

到底怎么实现啊?

   
作者: pmerofc    时间: 2012-12-03 18:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: zighouse    时间: 2012-12-03 18:56
好好去学一下字符串的操作,再来写 c 程序。
作者: folklore    时间: 2012-12-03 19:04
@xike2002
你写的C++吧?
试试
  1. strcpy(b,&a[strlen(a)-sizeof(b)+1]);
复制代码

作者: xike2002    时间: 2012-12-03 19:10
回复 6# folklore


函数memcpy的 void *memcpy(void *dest, const void *src, size_t n)中dest和src都是指针类型的啊

而我的程序中
typedef struct sslKeyInfo {
                char buffmodName[CSLC_KMN_LEN];
                int  isSetMod;
                int  isSslConnect;
        } sslKeyInfo;
变量都是char型的,而不是指针啊
作者: xike2002    时间: 2012-12-03 19:11
回复 13# folklore


    函数strcpy的参数也是指针类型的吧?
作者: folklore    时间: 2012-12-03 19:20
@xike2002
楼主,我被你打败了,求求你Google一下C语言入门,如果你是新手,一个月,如果你学过其它语言,10分钟就好
作者: jaychen1989    时间: 2012-12-03 21:50
char b = "567890123 ...

敢问这个是什么东东...
作者: w_anthony    时间: 2012-12-04 13:05
既然是段错误,显然是checkTerminal->arg0这个东西有毛病,往这里写数据都会段错误。
你可以试试char b[24],  然后strcpy(b, keyInfo[k]->buffmodName + 4), 再打印b,遇到问题不能一根筋,你所认为的错误未必是在“点”上,要发散思维,怀疑一切可以怀疑的,然后再“分步”去验证怀疑的是否正确,而不是让多个“点”搅在一起,搞不清楚到底是哪里出现问题。
作者: xike2002    时间: 2012-12-04 15:28
回复 18# w_anthony

问题已解决,谢谢!
   
作者: lsmslsms    时间: 2012-12-04 16:38
snprintf不好使么?
作者: linux_c_py_php    时间: 2012-12-04 21:07
  1. [root@vps616 c]# ./main
  2. 5678901234567890[root@vps616 c]# cat main.c
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>

  6. int copy_str_suffix(const char *src, int copy_len, char *dest) {
  7.     if (!src || !dest) {
  8.         return -1;
  9.     }

  10.     int src_len = strlen(src);
  11.     int src_off = src_len - copy_len;
  12.     if (src_off < 0) {
  13.         src_off = 0;
  14.     }
  15.    
  16.     int dest_len = src_len - src_off;
  17.     memcpy(dest, src + src_off, dest_len);
  18.     dest[dest_len] = '\0';
  19.     return dest_len;
  20. }

  21. int main(int argc, char* const argv[]) {
  22.     char a[21] = "12345678901234567890";
  23.     char b[17];
  24.     if (copy_str_suffix(a, 16, b) != -1) {
  25.         printf("%s", b);
  26.     }
  27.     return 0;
  28. }
复制代码
自己考虑加检验dest长度的逻辑.
作者: hellioncu    时间: 2012-12-04 21:15
linux_c_py_php 发表于 2012-12-04 21:07
自己考虑加检验dest长度的逻辑.



长度 int跟size_t,有警告的吧
作者: lastcode    时间: 2012-12-07 11:17
用字符串指针啊 墨迹




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2