C语言不使用string.h/ctype.h如何获取用户输入字符的实际长度
问题解答
代码问题根源
sizeof是C语言的编译期运算符,计算的是变量本身占用的内存字节数,和实际输入的内容完全无关:单个char变量固定占1字节,所以输出结果永远是1;长度为10的char数组固定占10字节,所以输出结果永远是10。scanf("%c")只能读取1个字符,本身就不支持统计多字符输入的长度;scanf("%s")虽然可以读取字符串,但你没有额外统计字符串的有效字符数量。
解决方案(不使用<string.h>、<ctype.h>)
方案1:存储输入内容后自行统计长度
如果需要保留用户输入的内容,可以用数组存储后遍历计数:
int main(void) { // 多开1位空间存储字符串结束标记'\0',最多可存10个有效字符 char character[11]; int len = 0; printf("Introduce maximum 10 characters: "); // 限制最多读取10个字符,避免输入溢出引发内存问题 scanf("%10s", character); // 遍历到结束标记'\0'就停止,累计的数值就是有效字符数 while(character[len] != '\0') { len++; } printf("\nSize of input: %d", len); return 0; }
方案2:逐字符读取直接计数
如果不需要保留输入内容,只需要统计数量,可以读取的同时计数,还能支持统计空格、换行等%s无法识别的字符:
int main(void) { char c; int count = 0; printf("Input characters, press Enter to finish: \n"); // 读到换行符时停止计数,也可根据需求调整停止条件 while(scanf("%c", &c) == 1 && c != '\n') { count++; } printf("Input length: %d", count); return 0; }
补充说明
C语言中所有字符串默认以'\0'(ASCII值为0的空字符)作为结束标记,统计字符串长度的逻辑就是从第一个字符开始计数,直到遇到'\0'为止,这也是方案1中数组需要多开1位存储空间的原因。
内容的提问来源于stack exchange,提问作者mexicanburrito
相关产品推荐
相关产品推荐

