黑马程序员技术交流社区

标题: C语言小问题 [打印本页]

作者: duocaikatong    时间: 2014-12-24 21:16
标题: C语言小问题
#include <stdio.h>
int main()
{
    char str[100];
    printf("请输入一段英文句子:\n");
    scanf("%s",str);
    printf("%s\n",str);
   
}为什么输入句子hello java world 运行结果只能打出hello呢,好像有空格就不能输出了。


作者: zhaojiajun    时间: 2014-12-24 21:16
duocaikatong 发表于 2014-12-25 00:43
输入一英文句子,将其中所有单词首字符转换成大写后输出。那这个题目里面不能输入空格吗? ...

这个题目能做,你这个代码不能实现,要改的,下面是我看到其他同学的做法,拿过来给你看一下吧
#include <stdio.h>

int main(int argc, const char * argv[])
{
    printf("请输入一段英文:\n");
   
    char a[100];  //定义一个数组接收字符串
   
    char *p = a;  //定义一指针指向数组首元素
   
    gets(a);  //输入一句英文

        if(*p != ' '&& *p >='a' && *p <='z' )  //如果不为空格且是小写
        {
                        *p -= 32;
            p++;
        }
                else if(*p != ' '&& *p >='A' && *p <='Z') // 如果不为空格且是大写
                {
                        p++;
                }
        else if(*p == ' ')  // 如果为空格
        {
            p++;
        }   
    while(*p != '\0')  //循环直到遇到\0
    {
        
      if(*p != ' ')  //如果不为空格就继续判断
        {
            p++;
        }
        else if(*p == ' ')  //如果检测到了空格就使下一个字母变为大写
        {
            p++;
            if(*p >='a' && *p <='z' )
                *p -= 32;
        }
    }
   
    puts(a);  //输出a
   
    return 0;
}
作者: zhaojiajun    时间: 2014-12-25 00:27
不是初始化时,数组不能被整体赋值。编译系统把空格做为字符串的分隔符,会把hello作为一个字符,然后在hello后面加 \0 ,所以只会显示出hello一个字符,可以看一下strcpy函数,或者str[0]='h';str[1]='e'....
作者: duocaikatong    时间: 2014-12-25 00:43
zhaojiajun 发表于 2014-12-25 00:27
不是初始化时,数组不能被整体赋值。编译系统把空格做为字符串的分隔符,会把hello作为一个字符,然后在hel ...

输入一英文句子,将其中所有单词首字符转换成大写后输出。那这个题目里面不能输入空格吗?
作者: duocaikatong    时间: 2014-12-25 00:55
zhaojiajun 发表于 2014-12-25 00:27
不是初始化时,数组不能被整体赋值。编译系统把空格做为字符串的分隔符,会把hello作为一个字符,然后在hel ...

输入一英文句子,将其中所有单词首字符转换成大写后输出。(C语言)那这种问题怎么破呢?如果输入单词后面有空格就没了?

作者: zhaojiajun    时间: 2014-12-25 00:57
还有strcpy函数你可以看看的
作者: duocaikatong    时间: 2014-12-25 01:02
zhaojiajun 发表于 2014-12-25 00:57
还有strcpy函数你可以看看的

这个李明杰的基础视频都没有讲strcpy和gets() puts()方法,考黑马会考这些啊
作者: 小徐_y8nUx    时间: 2014-12-25 09:36
学习了!!
作者: 寻觅    时间: 2014-12-25 10:33
我是过来学习的,对于c的输入和输出不太懂
作者: xiezhongmin    时间: 2014-12-26 01:49
zhaojiajun 发表于 2014-12-25 00:27
不是初始化时,数组不能被整体赋值。编译系统把空格做为字符串的分隔符,会把hello作为一个字符,然后在hel ...

应该是与空格有关,scanf函数直接操作的是地址不是赋值,所以与这个什么“不是初始化时,数组不能被整体赋值”无关。
作者: xiezhongmin    时间: 2014-12-26 01:59
zhaojiajun 发表于 2014-12-25 00:27
不是初始化时,数组不能被整体赋值。编译系统把空格做为字符串的分隔符,会把hello作为一个字符,然后在hel ...

scanf函数操作的是地址,不是赋值,所以与“不是初始化时,数组不能被整体赋值”无关,而且事实证明:只要不空格 字符串就可以完整的输出,如果是赋值运算,难道没初始化的同时,你可以把字符串赋值给字符数组?
作者: xiezhongmin    时间: 2014-12-26 02:00
所以只与空格有关
作者: 15342193033    时间: 2014-12-26 20:52
你输出的时候printf("%s\n",str);那个str是数组名,代表地址,输出时就会依次输出,直到遇到\0为止,而在字符串中,空格就被看成\0了吧,我也不太清楚,感觉是这样
作者: 15342193033    时间: 2014-12-26 21:14
你把scanf("%s",str);这句换为gets(str);
作者: 15342193033    时间: 2014-12-26 21:15
上一个说错了,不是printf的问题,是scanf("%s",str);的问题
作者: yuanlingqi    时间: 2014-12-26 21:49
这个问题说明你的scanf函数没掌握,你使用scanf接收一个字符串,而 scanf从键盘读取你的输入字符串,肯定是需要一个终止符的,空格回车tab都是终止符,所以你后面的数据是无法被读取的。
作者: scarlettche    时间: 2014-12-26 23:14
不能使用scanf标准格式输入,只能使用gets(&str),虽然这样有warning!
作者: zhaozigeng    时间: 2014-12-28 10:15

scanf函数操作的是地址,不是赋值,所以与“不是初始化时,数组不能被整体赋值”无关,而且事实证明:只要不空格 字符串就可以完整的输出,如果是赋值运算,难道没初始化的同时,你可以把字符串赋值给字符数组?
作者: 些许    时间: 2015-1-2 20:29
楼主这节奏是C语言入门后 在学java、IOS???
作者: 些许    时间: 2015-1-2 20:31
scanf 读到空格就结束输入环节  读字符串要用gets 等语句读到回车结束
作者: 些许    时间: 2015-1-2 20:34
兄弟 你走弯路了吧  你直接咨询黑马程序员网址的老师啊  老师会根据你报哪个课 给你推荐视频的 考试就考给你推荐的视频里面的 你学C语言是为了程序入门么?
作者: 些许    时间: 2015-1-2 20:36
兄弟 你走弯路了吧  你直接咨询黑马程序员网址的老师啊  老师会根据你报哪个课 给你推荐视频的 考试就考给你推荐的视频里面的 你学C语言是为了程序入门么?
作者: 王德亮    时间: 2015-1-3 11:49
百度百科中-scanf函数
http://baike.baidu.com/link?url=ufLRYOQQ-aDodMSqy-9Nst-oMH9Zjb-2-xR5Kbm881fdWobDUm-VJaQZbbOeD29w_KedEEtH62nX9SKGWP58tq#4
找 [注意问题]那一栏看
里面介绍了

(5) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。
C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

也给了例子和解释






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2