2014-11-03 73 views
-5

這裏afaik,%s將繼續打印,直到它終止,即\0%c如何知道終止並最終只打印一個字符?%c和%s如何在C語言中工作?

+0

它總是打印1個字符,不需要魔法 – 2014-11-03 03:42:14

+2

http://man7.org/linux/man-pages/man3/printf.3.html(猜你要問關於'printf'。在這如果您確實應該閱讀文檔,請將其鏈接以便於閱讀。) – Deduplicator 2014-11-03 03:42:44

+1

使用'%c'格式,'printf'不需要知道終止。 – 2014-11-03 03:49:49

回答

1

%c%s是標準庫中printf()函數的一部分,不屬於語言本身的一部分。

話雖這麼說,printf()使用以下%字符(S),與stdarg功能一起,以確定它會從它的參數讀什麼類型的變量以及它會用它做什麼。 printf()的高度簡化實現可能如下所示。

特別注意%c%s不是處理相同類型的參數! %c涉及char(即單個字符),而%s涉及char *(即指向字符數組的指針,希望以null結尾)。

int printf(const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt);  // Initialize stdargs 

    const char *p = fmt; // Pointer into the format string 
    while (*p != '\0') { 
     char ch = *p++; // Get the next character of the format string 

     if (ch != '%') { // Not a format character? Just print it 
      putchar(ch); 
      continue; 
     } 

     char fmt = *p++; // Get the character following the % 

     if (fmt == 'd') { 
      int n = va_arg(ap, int); 
      print_number(n); 

     if (fmt == 'c') { 
      char c = va_arg(ap, char); 
      putchar(c); 

     } else if (fmt == 's') { 
      char *str = va_arg(ap, char *); 
      print_string(str); 

     } else { 
      // Unrecognized format character 
     } 
    } 

    va_end(ap); 

    return n; 
} 
+0

--->'int c = va_arg(ap,int);的putchar(C);' – mafso 2014-11-03 10:03:27

2

%c總是打印單個字符。

char x = 'a'; 

這裏我們有一個需要打印的單個字符。

char x[2] = "a"; 

在上面的例子中,我們有2個字符之一是'a'和另一個是'\0'

因此,當打印時,我們需要使用%s,以便在遇到字符串末尾的'\ 0'並打印字符串。

2

字符串格式不是C或語言的特徵。是由C運行時庫提供的工具。

「%c」不需要終止符,因爲它只處理一個字符。

「%s」繼續處理字符,直到遇到以C表示爲'\ 000'(或'\ 0')的ASCII NUL字符。字符串或字符常量中的正斜槓是沒有任何特殊含義的可打印字符。

此外,幾乎所有的C運行時庫在%s長度提供相當多的控制:

  • %.123s處理直至123個字符,如果沒有遇到一個NUL
  • %.*s需要兩個匹配參數:第一個是一個指定最大字段寬度的整數,第二個是字符指針。例如:printf ("x = %.*s\n", 15, ptr);
2

%c表示字符,範圍是0×00到0xff(無符號),其是1個字節,一個存儲單元能保存數據的1個字節,%C將打印僅一個存儲器位置的數據,因此終止字符不是必需的。

%s表示字符流意味着它必須從內存位置流中獲取數據,因此它需要終止字符,因此%s需要'\ 0'。