特殊字符串

时间:2015-04-27 06:41:20

标签: c string

我需要使用一些特殊字符,例如:!,",#,~

如果我这样做:

char arr[10]  = "''''''''''";
char arr1[10] = "!!!!!!!!!!";
char arr2[10] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);

然后printf打印字符串和一些垃圾。

我哪里错了?

3 个答案:

答案 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}}

<强>解决方案:

  1. 将大小分配留给编译器,最好的方法。

     char arr[11]  = "''''''''''";  //10 elements + 1 null
    
  2. 或至少分配足够的内存,以便可以容纳null-termiantor。

    arr1
  3. 请对arr2public 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; } 执行相同操作。