簡體   English   中英

數組在末尾顯示隨機字符

[英]Array showing random characters at the end

我想用C上的數組測試一下,因為我剛開始學習這門語言。 這是我的代碼:

#include <stdio.h>
main(){
  int i,t;
  char orig[5];
  for(i=0;i<=4;i++){
    orig[i] = '.';
  }

  printf("%s\n", orig);
}

這是我的輸出:

.....�

就是這樣。 那些神秘人物是什么? 我做錯了什么?

帶有printf() %s需要一個指向字符串的指針,即指向空終止字符數組的初始元素的指針。 您的數組未終止。

因此,在搜索終止空字符時, printf()超出綁定范圍,隨后調用未定義的行為

如果要將其用作字符串 ,則必須對數組進行空終止。

引用: C11 ,章節§7.21.6.1,( 強調我的

s

如果不存在l length修飾符,則參數應該是指向字符類型數組的初始元素的指針。 280)來自數組的字符被寫入(但不包括)終止空字符。 如果指定了精度,則不會寫入多少個字節。 如果未指定精度或大於數組的大小,則數組應包含空字符。

快速解決方案

  • 將數組大小增加1, char orig[6];
  • 最后添加一個null -terminator。 在循環體之后,添加orig[i] = '\\0';

然后,打印結果。

char orig[5];//creates an array of 5 char.  (with indices ranging from 0 to 4)

|?|?|?|0|0|0|0|0|?|?|?|?|
      |         ^memory you do not own (your mysterious characters)
      ^start of orig

for(i=0;i<=4;i++){  //attempts to populate array with '.'
    orig[i] = '.';

|?|?|?|.|.|.|.|.|?|?|?|?|
      |         ^memory you do not own (your mysterious characters)
      ^start of orig

這會導致一個非null終止的char數組,如果在需要C字符串的函數中使用它,它將調用未定義的行為。 C字符串必須包含足夠的空間以允許空終止。 將您的聲明更改為以下內容以適應。

char orig[6];

然后將null終止添加到循環的末尾:

  ...
  for(i=0;i<=4;i++){
    orig[i] = '.';
  }
  orig[i] = 0;

導致:

|?|?|?|.|.|.|.|.|0|?|?|?|
      |           ^memory you do not own
      ^start of orig

注意 :因為空終止導致C字符串,所以使用它的函數知道如何解釋其內容(即沒有未定義的行為),並且您的神秘字符被保留。

數組和字符數組之間存在差異。 您可以認為字符數組是數組的一種特殊情況,其中每個元素在C中都是char類型,並且數組應該以字符nullASCII value 0 )結束(終止)。

printf() %s格式說明符需要一個指向由null字符終止的字符數組的指針。 您的數組不會以空值終止,因此, printf函數超出您指定的5個字符,並打印出第5個字符('。')后出現的垃圾值。

要解決您的問題,您需要靜態分配大小比您要存儲的字符多一個的字符數組。 在您的情況下,大小為6的字符數組將起作用。

#include <stdio.h>
int main(){
  int i,t;
  char orig[6]; // If you want to store 5 characters, allocate an array of size 6 to store null character at last position.

  for (i=0; i<=4; i++) {
    orig[i] = '.';
  }

  orig[5] = '\0';

  printf("%s\n", orig);
}

有理由為null字符浪費一個額外的字符空間。 原因是無論何時將任何數組傳遞給函數,只有指向第一個元素的指針才會傳遞給函數(在函數的堆棧中推送)。 這使得函數無法確定數組的結尾(意味着像sizeof這樣的運算符在函數內部不起作用,而sizeof將返回機器中指針的大小)。 這就是原因,像memcpymemset的函數會使用一個額外的函數參數來提及數組大小(或者你想要操作的長度)。

但是,使用字符數組,函數可以通過查找特殊字符( null字符)來確定數組的大小。

您需要在字符串的末尾添加NUL字符( \\0 )。

#include <stdio.h>

main()
{
  int  i,t;
  char orig[6];

  for(i=0;i<=4;i++){
    orig[i] = '.';
  }

  orig[i] = '\0';
  printf("%s\n", orig);
}

如果您不知道\\0是什么,我強烈建議您查看ascii表( https://www.asciitable.com/ )。

祝好運

prinftf獲取任何內存位置的起始指針,在這種情況下為數組並打印,直到遇到\\0字符。 這些類型的字符串稱為null終止字符串。

所以請在末尾添加\\0並輸入字符直到(數組大小為2),如下所示:

main(){
  int i,t;
  char orig[5];
  for(i=0;i<4;i++){ //less then size of array -1
    orig[i] = '.';
  }
  orig[i] = '\0'
  printf("%s\n", orig);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM