C语言字符串长度问题:scanf读取不完整致函数仅获首个单词长度
问题:读取带空格字符串时仅获取首个单词的长度
主代码片段
printf("enter a string: "); scanf("%s",C); // 预期输入 "Hello world this is a string" printf("%d\n",strlen(C)); temp=com0(C);
这段代码运行后,strlen(C)输出5(仅为"Hello"的长度),传入com0函数后,函数内的strlen(k)同样输出5,无法获取完整字符串的长度。
com0函数代码
bool com0(char k[]){ printf("%d\n",strlen(k)); if(k[0]>='a' && k[0] <= 'z'){ return com1(nextchar(k+1)); } else{ return false; } }
问题原因
scanf("%s")的%s格式符只会读取连续的非空白字符,遇到空格、换行或制表符就会停止读取,所以变量C中只存储了第一个空格前的"Hello",后续内容根本没被读入。
解决方案
用fgets替代scanf来读取包含空格的完整字符串:
printf("enter a string: "); // 假设C是足够大的字符数组,比如char C[100]; fgets(C, sizeof(C), stdin); // 可选:移除fgets读取到的换行符(如果存在) size_t str_len = strlen(C); if (str_len > 0 && C[str_len - 1] == '\n') { C[str_len - 1] = '\0'; } printf("%d\n",strlen(C)); temp=com0(C);
fgets会读取直到换行符或缓冲区满的所有字符(包括空格),这样就能获取完整的输入字符串,strlen和com0函数也能得到正确的总长度。
内容的提问来源于stack exchange,提问作者Houssam Eddine
相关产品推荐
相关产品推荐

