我需要使用一些特殊字符,例如:!,",#,~
等
如果我这样做:
char arr[10] = "''''''''''";
char arr1[10] = "!!!!!!!!!!";
char arr2[10] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);
然后printf
打印字符串和一些垃圾。
我哪里错了?
答案 0 :(得分:4)
字符数组(也称为C字符串)以空值终止,因此您需要在数组中使用额外的索引来存储空字符。如果你需要一个10个字符的字符串,你需要创建一个可以存储11个字符的字符串(空字符'\0'
的额外字符)
所以,将代码更改为
char arr[11] = "''''''''''";
char arr1[11] = "!!!!!!!!!!";
char arr2[11] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);
甚至更好,正如@TheParamagneticCroissant所建议的,你可以做到
char arr[] = "''''''''''";
char arr1[] = "!!!!!!!!!!";
char arr2[] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);
有了这个,编译器就会自己找出长度。
答案 1 :(得分:1)
nul字符需要一个字节空格:
char arr[11] = "''''''''''";
char arr1[11] = "!!!!!!!!!!";
char arr2[11] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);
或者简单地说:
char arr[] = "''''''''''";
char arr1[] = "!!!!!!!!!!";
char arr2[] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);
答案 2 :(得分:1)
我希望你能得到你的答案,只是为%s
printf()
中的C11
格式说明符澄清一点,根据l
标准文件,章节§7.21.6.1 ,
s
如果不存在
%s
长度修饰符,则参数应为指向字符类型数组的初始元素的指针。数组中的字符是 写入(但不包括)终止空字符。
这意味着,为char
提供的参数指针应该是指向null
的指针,最后有一个char
来标记数组结束< / em>的。因此,以null结尾的char arr[10] = "''''''''''";
数组在C中被视为字符串。
现在,回到你的案子,
char
你有一个10元printf()
数组的10个初始化器。因此,null-termiantor没有空间。当您将此数组的基址作为%s
的参数进行sypplu以用于printf()
时, char arr[] = "''''''''''";
不知道停止的位置,因此读取超出已分配的内存,而后者又会调用{ {3}}
<强>解决方案:强>
将大小分配留给编译器,最好的方法。
char arr[11] = "''''''''''"; //10 elements + 1 null
或至少分配足够的内存,以便可以容纳null-termiantor。
arr1
请对arr2
和public boolean onQueryTextSubmit(String s) {
mSearchView.setQuery("", false);
mSearchView.clearFocus();
mSearchView.setIconified(true);
url+="intitle="+s+"&site=stackoverflow";
// mSearchView.setQuery("", false);
// mSearchView.clearFocus();
// mSearchView.setIconified(true);
new JSONTask().execute();
return false;
}
执行相同操作。