首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

C語言字符串輸入輸出完全指南:printf/puts、scanf/gets 差異與緩衝區機制

     編輯:C 語言基礎

字符串輸出函數

演示代碼

#include <stdio.h>
int main() {
    char str[] = "https://c.biancheng.net";
    printf("%s\n", str);
    printf("%s\n", "https://c.biancheng.net");
    puts(str);
    puts("https://c.biancheng.net");
    return 0;
}

字符串輸入函數

函數特點示例
puts(str)只能輸出字符串,自動換行puts("Hello");
printf("%s", str)通用格式化輸出,不自動換行printf("%s\n", str);

scanf 讀取字符串的關鍵行為

1. 遇空格截斷

scanf("%s", str2);  // 輸入 "Java Python C-Sharp"
printf("%s", str2); // 輸出 "Java"

2. 緩衝區殘留導致連續讀取

scanf("%s", str1);  // 讀 "Java",留 " Python C-Sharp\n"
scanf("%s", str2);  // 直接讀 "Python",不等待輸入
scanf("%s", str3);  // 直接讀 "C-Sharp"

為什麼 scanf 字符串不加 &?

數組名 本身就是首元素地址(首地址)。

  • char str[20]; → str 等價於 &str[0]
  • scanf("%s", str); 正確,scanf("%s", &str); 錯誤(類型不匹配)

gets 讀取整行(含空格)

#include <stdio.h>
int main() {
    char str1[30], str2[30];
    gets(str1);  // 輸入 "Java Python C-Sharp"
    gets(str2);  // 輸入 "https://c.biancheng.net"
    printf("str1: %s\nstr2: %s\n", str1, str2);
    return 0;
}

運行結果

str1: Java Python C-Sharp
str2: https://c.biancheng.net

scanf vs gets 選擇指南

函數特點空格處理緩衝區殘留
scanf("%s", str)格式化讀取單詞遇空格/換行停止留在緩衝區,下次 scanf 直接讀取
gets(str)讀取整行包含空格,遇換行停止消耗換行符,無殘留
安全警告:gets 無長度限制,極易導致緩衝區溢出攻擊,實際開發嚴禁使用。請改用 fgets(str, sizeof(str), stdin),並手動去除末尾 \n。

字符串輸入輸出最佳實踐

  1. 輸出:優先 puts(自動換行)或 printf("%s\n")
  2. 輸入單詞:scanf("%99s", str)(限制長度防溢出)
  3. 輸入整行:fgets(str, sizeof(str), stdin) + 去除 \n
  4. 理解緩衝區機制,避免殘留字符干擾後續讀取
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
需求推薦函數理由
單詞(無空格)scanf("%s")簡潔、自動分詞
整行(含空格)fgets(str, n, stdin)安全、可限長度、標準替代 gets
教學演示整行gets()簡單但不安全,已從 C11 標準移除