簡體   English   中英

c,c ++最基本的雙引號

[英]c, c++ most basic double quotes

char* a="HELLO WORLD";

如果“ H”的地址為0x01,則帶有%s的printf將打印到D,但是如果使用手動打印例程編寫了相同的代碼

while(*a!=NULL) {printf("%c",n[a]);n++;}

這會再打印幾個字符。

printf("%s",a);

完美打印。

while(*a++) printf("%c", *(a-1)); or 

for(;*a++;)printf("%c", *(a-1));

雖然工作,但我不想解決方案,但過程機制..

所以我想到的問題是

printf是從某個寄存器(或任何存儲單元)獲取字符串的長度還是執行字符檢查..然后打印...

索引到字符串的方式很奇怪。 它適用於字符串,但不會停止,因為您永遠不會更改* a的值。 您的程序所做的是嘗試獲取n a偏移量,因此對於前11個位置,它們是相同的,但是循環不會終止,因為*a始終為'H' 您希望終止條件是n < strlen(a)

但是,編寫該程序的更簡潔的方法是:

int main(int argc, char **argv) {
    char *a = "HELLO WORLD";
    while(*a) printf("%c", *a++);
    return 0;
}

之所以可行,是因為a是一個字符數組,當我們打印出每個字符(取消引用存儲在該位置的值)時,我們也將移至下一個位置。 該字符串應以NULL引用終止,這將導致循環在NULL終止符處終止正弦*a == 0

您的意思是您還是有錯誤:

int main() {
   int n = 0;
   char* a="HELLO WORLD";

   while(a[n] != NULL) {printf("%c",a[n]);n++;}
}

關於錯誤的解釋:

while(*a!=NULL) printf("%c",n[a]);n++;
  1. a不會在任何地方修改,因此*a不會更改其值。
  2. 盡管n[a]在CI中是完全有效的構造,但強烈建議不要使用它,因為它在語義上是不正確的。 您按索引訪問數組,而不是按數組訪問。
  3. 您增加索引( n++ ),但檢查指向數組的指針。 你能不能增加a inself這樣的: while(*a!=NULL) {printf("%c",*a);a++;}

這樣做的核心方法是:

#include <iostream>
using namespace std;

int main() {
    char *a="HELLO WORLD";
    int n = 0;
    while(a[n]!=NULL){
        cout<<a[n];
        n++;
    }

   cout<<'\n';
   return 0;
}

據我所記得,默認情況下,當您創建char* a ,它將在內存中顯示為{HELLO WORLD\\0} (%s知道字符串結尾的方式是'\\ 0')。

不知道'\\0' == null是否會產生true ..但我對此表示懷疑

暫無
暫無

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

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