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

C语言如何提取字符串每个字符存入无空格数组?strtok实现结果异常如何解决

核心错误说明
  1. 逻辑不符合需求:你的目标是收集输入中所有非空格字符,而当前strtok的用法仅提取了每个空格分隔子串的第一个字符,完全无法覆盖所有非空格字符。
  2. 打印格式误用:你使用%s格式符打印&array[i],%s的规则是从传入的指针地址开始读取内容,直到遇到\0才停止输出。array是单字符存储的数组,每个元素后没有手动加字符串终止符,才会出现连续输出长串的现象,并不是数组真的存储了多段字符串。
实现方案

这个需求逻辑非常简单,直接遍历输入字符串过滤空格即可,不需要使用strtok,代码更易读也不容易出错:

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

int main() {
    char input[100] = {0};
    // 读取一行输入,避免缓冲区溢出
    fgets(input, sizeof(input), stdin);
    // 去除fgets读取的末尾换行符
    input[strcspn(input, "\n")] = '\0';

    char array[50] = {0};
    int counter = 0;

    // 遍历所有字符,过滤空格后存入数组
    for(int i = 0; input[i] != '\0'; i++) {
        if(input[i] != ' ') {
            array[counter++] = input[i];
        }
    }

    // 打印单个字符使用%c格式符
    for(int i = 0; i < counter; i++) {
        printf("%c\n", array[i]);
    }
    return 0;
}

如果你坚持要使用strtok实现,需要遍历每个分割后子串的全部字符再存入数组:

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

int main() {
    char input[100] = {0};
    scanf("%[^\n]", input);

    char *temp = strtok(input, " ");
    char array[50] = {0};
    int counter = 0;

    while(temp != NULL) {
        // 遍历当前子串的所有字符存入数组
        for(int i = 0; temp[i] != '\0'; i++) {
            array[counter++] = temp[i];
        }
        temp = strtok(NULL, " ");
    }

    for(int i = 0; i < counter; i++) {
        printf("%c\n", array[i]);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Jung Jae Won

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:24:03