4
回答
c语言 计算字符串列表的长度,转义好像出问题
华为云7大明星产品0元使用! >>>   

c语言问题,

我有一组的字符串“123” “456” “789”

他们原来的存储方式是 123','456','789 ,其中 ',' 是分隔符

现在要把这写字符串都放在一起,char *dbuf;并且把','转换为\0

也就是说想把他们都存储的char * dbuf里面,其中的字符串之间的分隔符是'\0',dbuf的最后也要加上一个‘\0’表示整个字符串列表结束。 现在要计算dbuf的长度,

len(dbuf) = strlen("123")+1+strlen("456")+1+strlen("789")+1+1

转换的部分还没写,计算长度的代码,大致如下

 

 int main()
 {
	  char  dbuf[1024]="123\x00456\x00789\x00\x00"; 
	  int len = 0;
	  int i=0;
	  int n=0;
	  while (dbuf[i] !='\x00' || dbuf[i+1]!='\x00') 
	  { 
		printf("%s\n", dbuf+i);
	    len += strlen(dbuf+i) + 1;
	    n++;
	    i+=len;
	  }
	  printf("len = %d, n=%d, i=%d \n", len ,n , i);
	  return 1;
 }

现在代码报错,

test.cpp:8:21: 警告: 16 进制转义序列越界 [默认启用]

程序结果是

123V�

len = 6, n=1, i=6 

估计是转义\x00后面还跟着数字,造成错误

如果写成这样,即加上空格,会正常,但是加上空格就多了额外的数据

 char  dbuf[1024]="123\x00 456\x00 789\x00\x00"; 

举报
yandong
发帖于5年前 4回/1K+阅
共有4个答案 最后回答: 5年前

没看懂,你上面的代码和 下面的目标有什么联系。哈。“

他们原来的存储方式是 123','456','789 ,其中 ',' 是分隔符

现在要把这写字符串都放在一起,char *dbuf;并且把','转换为\0”


--- 共有 1 条评论 ---
yandong我是想把问题的来源说清楚。 问题中的代码只是计算长度的,没有涉及转换的问题,dbuf的内容是我指定的,但是其中的 \0 转义有问题,不知道该怎么解决 5年前 回复

引用来自“YiseNet”的答案

\x00换成\000试试
 int main()
 {
	  char  dbuf[1024]="123\000456\000abc\000def\000789\000\000"; 
	  printf("%s\n", dbuf+0);
	  printf("%s\n", dbuf+4);
	  printf("%s\n", dbuf+8);
	  printf("%s\n", dbuf+12);
	  int len = 0;
	  int i=0;
	  int n=0;
	  while (dbuf[i] !='\000' || dbuf[i+1]!='\000') 
	  { 
		printf("%s\n", dbuf+i);
		printf("len=%d, i=%d\n", len ,i);
	    len += strlen(dbuf+i) + 1;
	    n++;
	    i=i+strlen(dbuf+i) + 1;
	  }
	  len++;
	  printf("len = %d, n=%d, i=%d \n", len ,n , i);
	  return 1;
 }


这个可能是C语言中的一个bug,根据C99的规定,如果一个字符由八进制表示。那么\0后面的最多三个数字字符都会算作一个字符。例如

\000 = 是空字符

"\001" = 这个是包含一个字符的字符串,而不是\00这个字符,加上1这个字符组成的字符串

"\01 a"= 三个字符,一个是ascii为1的字符,一个空格字符,一个a字符。

有意思的是,如果你想用16进制表示,那么它会尽可能的包含\x后面的数字组成一个字符,这就是你遇到的问题。

"\x988888888888888888888888888888", 注意,这个字符串其实只包含一个字符而已。编译器会给出一个warning。

这就是你遇到的问题。

"123\x00456\x00789\x00\x00"

中间的\x00456其实是一个字符

\x00789也是一个字符。

顶部