You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针逐词输出字符串的C语言程序问题排查

解决C语言指针逐词输出句子的问题

嘿,我来帮你排查这个逐词输出程序的问题~先拆解下你的代码里的核心问题:

原代码里的两个关键问题

  1. 输入读取不完整:你用了scanf("%s", str),但%s格式符会在遇到空格、制表符或换行时停止读取,所以你的str里永远只能存下输入的第一个单词,后面的内容根本没被读进数组里,自然没法处理多单词的句子。
  2. 逐词逻辑有瑕疵:就算能读到空格,你的逻辑是遇到一个空格就换一行,要是输入里有连续空格,就会输出好几行空行,而且没有清晰处理“单词结束后换行”的逻辑。

修正后的代码

#include <stdio.h>
#include <string.h>

int main() {
    char str[100];
    char *p;

    printf("Sentence: ");
    // 用fgets读取整行输入,包含空格
    fgets(str, sizeof(str), stdin);
    // 去掉fgets读入的末尾换行符
    str[strcspn(str, "\n")] = '\0';

    p = str;
    while (*p != '\0') {
        // 跳过连续的空格,避免空行
        while (*p == ' ' && *p != '\0') {
            p++;
        }
        // 输出当前单词的所有字符,直到遇到空格或字符串结束
        while (*p != ' ' && *p != '\0') {
            printf("%c", *p);
            p++;
        }
        // 每输出一个单词就换行(排除末尾空格导致的空行)
        if (*(p-1) != ' ') {
            printf("\n");
        }
    }

    return 0;
}

关键改动说明

  • 替换输入方式:用fgets替代scanf("%s"),fgets可以读取整行内容(包括空格),最多读取sizeof(str)-1个字符,自动在末尾添加\0。
  • 处理换行符:fgets会把输入时的换行符也读进来,用strcspn定位换行符位置并替换成\0,避免后续逻辑出错。
  • 优化逐词逻辑:
    • 先跳过连续空格,避免输出空行;
    • 逐个输出字符直到遇到空格或字符串结束,完整输出单个单词;
    • 输出完单词后换行,同时判断避免末尾空格导致的多余空行。

这样修改后,就能正确读取整句输入,并且逐词每行输出一个单词啦~

内容的提问来源于stack exchange,提问作者Luka Milicevic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:42:49