C语言如何提取字符串每个字符存入无空格数组?strtok实现结果异常如何解决
核心错误说明
- 逻辑不符合需求:你的目标是收集输入中所有非空格字符,而当前
strtok的用法仅提取了每个空格分隔子串的第一个字符,完全无法覆盖所有非空格字符。 - 打印格式误用:你使用
%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
相关产品推荐
相关产品推荐

