s1e26 为什么屏幕录入结果不能正确存入数组了?
遇到一个很弱智的问题,应该是很久以前就学过的。可是现在找不到原因了,求助。题目要求屏幕录入一个英文句子,将句子拆分成一个个单独的单词。第一步存入数组,一开始还可以存入,可是代码改来改去,现在不能存入了,求助什么原因?感觉应该是某一个很简单的点,但是就是找不到呀。
#include<stdio.h>
int main()
{
char a;
char ch;
int m=1,n=0;
int i=0,j=1,k,p;
printf("请输入一个英文句子:");
while((ch=getchar()!='\n'))
{
if(ch!=' ')
{
a=ch;//将屏幕录入的字符存入数组,现在问题就卡在了这里,
i++; //移动数组位置
j++; //计算单词长度
}
else
{
a='\0';//将空格更换为结束符存储
i++;
j=1; //新一个单词计数
m++; //新一个单词开始位置
}
if(j>n)n=j;
}
char result; //定义题目要求的可变数组
for(i=0;i<20;i++)printf("a[%d]=%c\n",i,a); //临时检查录入结果,运行时发现数组里并没有内容
/*
//将存入值转存到题目要求的数组
i=0;
for(k=0;k<m;k++)
{
for(p=0;p<n;p++)
{
result=a;
i++;
if(result='\0')break;
}
}
printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n",m,n);
//结果数组格式输出
printf("现在依次打印每个单词:\n");
for(k=0;k<m;k++)printf("%s",result);
*/
return 0;
}
运行结果
看我注释
#include<stdio.h>
int main()
{
char a;
char ch;
int m=1,n=0;
int i=0,j=1,k,p;
printf("请输入一个英文句子:");
while((ch=getchar())!='\n')// 老问题了,我记得你之前也问过,长点记性吧
{
if(ch!=' ')
{
a=ch;//将屏幕录入的字符存入数组,现在问题就卡在了这里,
i++; //移动数组位置
j++; //计算单词长度
}
else
{
a='\0';//将空格更换为结束符存储
i++;
j=1; //新一个单词计数
m++; //新一个单词开始位置
}
if(j>n)n=j;
}
char result; //定义题目要求的可变数组
for(i=0;i<20;i++)printf("a[%d]=%c\n",i,a); //临时检查录入结果,运行时发现数组里并没有内容
/*
//将存入值转存到题目要求的数组
i=0;
for(k=0;k<m;k++)
{
for(p=0;p<n;p++)
{
result=a;
i++;
if(result='\0')break;
}
}
printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n",m,n);
//结果数组格式输出
printf("现在依次打印每个单词:\n");
for(k=0;k<m;k++)printf("%s",result);
*/
return 0;
} 本帖最后由 jackz007 于 2022-10-6 11:58 编辑
第11行应该是:
while((ch=getchar())!='\n')
这是我写的代码版本,谨供楼主参考
#include<stdio.h>
int main()
{
char ch , a ;
int i , j , k , m, n ;
printf("请输入一个英文句子:") ;
for(i = m = 0 , j = n = 1 ; (ch = getchar()) != '\n' ;) {
if(ch != ' ') {
if(j == 1) m ++ ;
a = ch ;
a = '\0' ;
j ++ ;
if(j > n) n = j ;
} else {
if(j > 1) { // 只有字符串之间的单个空格有效
j = 1 ;
i ++ ; // 保护上个字符串末尾的 '\0'
}
}
}
char result ;
for(i = k = 0 ; i < m ; i ++) for(j = 0 ; (result = a) ;) ; // 这里绝不可以只是简单地按照每个字符串 n 个字符进行分割和复制
printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n" , m , n) ;
printf("现在依次打印每个单词:\n") ;
for(k = 0 ; k < m ; k ++) printf("%s\n" , result) ;
}
编译、运行实况:
D:\\C>g++ -o x x.c
D:\\C>x
请输入一个英文句子: I am a disco danncer!
分割结果已存放到result的二维数组中。。。。。
现在依次打印每个单词:
I
am
a
disco
danncer!
D:\\C> jackz007 发表于 2022-10-6 11:04
第11行应该是:
这是我写的代码版本,谨供楼主参考
谢谢。这脑袋是木头疙瘩的。 #include<stdio.h>
int main()
{
char s={0},*s1=s;
int rt=scanf("%s",s);
int i=0;
while(getwchar()!='\n')
{
while(s);
rt=scanf("%s",s+i);
}
rt=printf("%s\n",s1);
s1+=rt;
while(rt>1)
{
rt=printf("%s\n",s1);
s1+=rt;
}
return 0;
}
jhq999 发表于 2022-10-6 12:05
题目要求用尽可能小的动态二维数组保存切分好的单词并进行显示。 jackz007 发表于 2022-10-6 12:15
题目要求用尽可能小的动态二维数组保存切分好的单词并进行显示。
没看到{:5_94:}{:5_104:} jackz007 发表于 2022-10-6 11:04
第11行应该是:
这是我写的代码版本,谨供楼主参考
谢谢jackz的讲解和代码。但是你的代码我看了一个下午了,只是看懂了前面存入采用的是和小甲鱼输出矩阵同一个方法,对结束符进行覆盖。
请问一下:你的代码第24行中,第二层循环for的第二个条件result=a是如何实现在遇到结束符时候判断为假的?这个语句应该是将数组a的值赋给数组result,那么怎么会是由于a=\0而被判断为假呢?不理解。 本帖最后由 jackz007 于 2022-10-6 17:00 编辑
先传递字符,再 j ++、k ++ ,然后,才判断刚才传递的字符是不是 '\0',如果是,那就结束。所以,这条语句会把整个单词连同末尾的 '\0' 一起传递完了才会终止循环。 jackz007 发表于 2022-10-6 16:45
先传递字符,再 j ++、k ++ ,然后,才判断刚才传递的字符是不是 '\0',如果是,那就结束。所以 ...
首先,谢谢回复。
其次,我还是没有明白。for循环的第二条件是,当这一个条件为0,或者说判断结果错误的时候,结束循环。那么在你的代码里,想数组result赋值了数组a的值,为什么会被判断为0呢? 顶级太阳 发表于 2022-10-6 17:54
首先,谢谢回复。
其次,我还是没有明白。for循环的第二条件是,当这一个条件为0,或者说判断结果错误的 ...
被复制字符的 ASCII 码数值就是整个表达式的值,也是维持循环所依据的逻辑条件,当被复制的字符的 ASCII 编码非 0 值时,循环得以正常继续,否则,就会立即结束。 顶级太阳 发表于 2022-10-6 17:54
首先,谢谢回复。
其次,我还是没有明白。for循环的第二条件是,当这一个条件为0,或者说判断结果错误的 ...
学习了,谢谢。 jackz007 发表于 2022-10-6 18:01
被复制字符的 ASCII 码数值就是整个表达式的值,也是维持循环所依据的逻辑条件,当被复制的字 ...
学习了,谢谢
页:
[1]