新手c语言问题 strcpy()函数

jaedongjuly 2012-05-28 11:14:17
printf("请输入:");
while((ch[i]=getch())!=32)
{ printf("*");

strcpy(b,ch);//第一处

if((ch[i]<47)||(ch[i]>58))
{ i=-1;
printf("错误,含有非法字符,请重新输入\n");
printf("请输入:");

}
i++;
}
strcpy(c,ch);//第二处
puts(c);printf("\n");
puts(b);printf("\n");
我觉的第一处与第二处有区别可是不道在哪里????????????
程序运行时没有看出问题呀?
结果没有问题。
希望大家可以告诉我一下。
...全文
331 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
proorck6 2012-05-30
  • 打赏
  • 举报
回复
while((ch[i]=getch())!=32)
这一句看不懂,32是多少?
建议用单引号括起的字符表示,这样做更清晰。
例如'\0' 'A' 等。
wZi 2012-05-30
  • 打赏
  • 举报
回复
为嘛我的回复被吞了
wZi 2012-05-30
  • 打赏
  • 举报
回复
我觉得楼主这里是要写成这样吧

if(!isdigit(ch[i]))
{
i -= 1;
printf("错误,含有非法字符,请重新输入\n");
printf("请输入:");
}
i++;


比较合理。。
prohibit 2012-05-30
  • 打赏
  • 举报
回复
再次抱歉,之前说的还是不够严谨,稍改了一下LZ的程序,核心功能不变(还是程序跑起来有说服力,凭空想的终究不靠谱啊,建议LZ多调试,单步跟踪,这样理解的就快了):
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define SIZE 16

int main(int argc, char **argv)
{
char b[SIZE] = {0}, c[SIZE] = {0}, ch[SIZE] = {0};
int i = 0;

printf("请输入:");
while((ch[i] = getchar()) != ' ')
{
/// 回车符也会被读入,去掉回车符
if ('\n' == ch[i])
{
continue;
}
strcpy(b, ch);//第一处

/// 判断是否是数字
//if((ch[i] < 47) || (ch[i] > 58))
if(!isdigit(ch[i]))
{
i = -1;
printf("错误,含有非法字符,请重新输入\n");
printf("请输入:");
}
i++;
}
strcpy(c, ch);//第二处

/// 打印b的相关信息
for (i = 0; i < SIZE; i++)
{
printf("|%c| ", b[i]);
}
printf("\n");
puts(b);

/// 打印c的相关信息
for (i = 0; i < SIZE; i++)
{
printf("|%c| ", c[i]);
}
printf("\n");
puts(c);

return 0;
}
//拿12345a678举例
//这里可以输入1,回车;2,回车。。。8,回车;空格,回车。也可以输入12345a678空格,回车,道理一样
/*
* while循环里输入数字时:
* 输入1时,字符串ch为1,拷到b中,b为1;输入2时,字符串ch为12,拷到b中,覆盖原来b中的值,b为12;之后类似。
*
* 1. 输入12345后,都不会执行while里的if判断语句内的语句,此时b和ch均为:12345;
* 2. 输入字符a时,不是数字,则进入while里的if判断,i的值变为-1,此时b和ch均为:12345a,之后i++,i值为0;
* 3. 输入6时,由于i为0,所以ch[i]即为ch[0],原来的ch[0]是1,现在重新赋值为6,i++;
* 4. 输入78时,道理同3,7和8分别覆盖原来的ch[1]和ch[2],此时b和ch均为:67845a,i的值为3;
* 5. 输入空格时,i = 3,ch[3]的值为空格,跳出循环,此时b的值依然为:67845a,字符串ch的值为:678 5a(原来ch[3]的值为4,现在被重新赋值为空格);
* 6. 执行strcpy(c, ch);,字符串c的值为字符串ch的值,即:678 5a
*/
(省略部分不重要的输出信息)
输入:12345a678 (最后一个字符是空格,输入别超过SIZE大小个字符)
输出:
|6| |7| |8| |4| |5| |a| || || || || || || || || || ||
67845a
|6| |7| |8| | | |5| |a| || || || || || || || || || ||
678 5a
prohibit 2012-05-29
  • 打赏
  • 举报
回复
首先strcpy用法不妥。
第一处复制的都是合法的值,第二处复制的是ascii为32的字符,即空格;
最后打印的一个是输入空格的前一个字符,一个是空格。
JAYXIANJIAN 2012-05-29
  • 打赏
  • 举报
回复
问题不太明白。。
yufengbei 2012-05-29
  • 打赏
  • 举报
回复
一个在循环里面啊
自信男孩 2012-05-29
  • 打赏
  • 举报
回复
while((ch[i]=getch())!=32)
第一、循环只是再给一个元素赋值,i的值并没有变化。
第二、strcpy的字符串需要时以'\0'结尾的,没有'\0'结尾的就不是字符串了。因此在做strcpy前需要保证字符指针或者数组都是以'\0'结尾的。
AnYidan 2012-05-29
  • 打赏
  • 举报
回复
char *strcpy(s,ct)
copy string ct to string s, including '\0'; return s.


两次的目的不同
yht8708 2012-05-29
  • 打赏
  • 举报
回复
有什么区别呢?都是复制ch[i],没看出有其它作用
jaedongjuly 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 8 楼 的回复:

引用 7 楼 的回复:
首先strcpy用法不妥。
第一处复制的都是合法的值,第二处复制的是ascii为32的字符,即空格;
最后打印的一个是输入空格的前一个字符,一个是空格。


我输入123456 可是puts出的两个结果一样。为什么?
抱歉,没仔细看,理解错了。。。
程序有if((ch[i]<47)||(ch[i]>58))这一句,所以while……
[/Quote]
例子明白了
可是如果要输入12345a678的话,当输入到a的时候程序就提示 请输入 了
还有strcpy 不是从字符串的开始到\0吗?
为什么 会从中间复制呢?(所以就这里的例子来说最终b实际上是:123\05a(12345a中的4被678后的'\0'代替),c是:678,只是puts打印出来时结果一样(打印遇到'\0'结束),道理和以下程序类似:)
我是一个初学者 问题有点多 ,不好意思。
W170532934 2012-05-29
  • 打赏
  • 举报
回复
第一次在while循环里面。第二次已经出了循环了。
prohibit 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:

引用 7 楼 的回复:
首先strcpy用法不妥。
第一处复制的都是合法的值,第二处复制的是ascii为32的字符,即空格;
最后打印的一个是输入空格的前一个字符,一个是空格。


我输入123456 可是puts出的两个结果一样。为什么?
抱歉,没仔细看,理解错了。。。
程序有if((ch[i]<47)||(ch[i]>58))这一句,所以wh……
[/Quote]补充一下,由于程序里判断if((ch[i]<47)||(ch[i]>58))后,将i置为-1,所以遇到非数字字符时,会重新从数组ch的第一个元素开始覆盖赋值,所以输入没出现非数字字符时,打印结果一样,否则,不一样,上面的这一句话“只是puts打印出来时结果一样(打印遇到'\0'结束)”没改对,原先举的例是12345a123,怕两个123搞混,就把后一个改成678了,看LZ理解没~~
prohibit 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:
首先strcpy用法不妥。
第一处复制的都是合法的值,第二处复制的是ascii为32的字符,即空格;
最后打印的一个是输入空格的前一个字符,一个是空格。


我输入123456 可是puts出的两个结果一样。为什么?
[/Quote]抱歉,没仔细看,理解错了。。。
程序有if((ch[i]<47)||(ch[i]>58))这一句,所以while循环里可能会出现这种情况:
输入12345a678 结束,由于strcpy复制时以'\0'结束且包括'\0',所以就这里的例子来说最终b实际上是:123\05a(12345a中的4被678后的'\0'代替),c是:678,只是puts打印出来时结果一样(打印遇到'\0'结束),道理和以下程序类似:
int main()
{
char arr[16] = {0};
int i = 0;
strcpy(arr, "abcdei");
strcpy(arr, "abcdefghi");
strcpy(arr, "abcd");
for (i = 0; i < 16; i++)
{
printf("|%c| ", arr[i]);
}
printf("\n");
puts(arr);
return 0;
}
最后输出结果:
|a| |b| |c| |d| || |f| |g| |h| |i| || || || || || || ||
abcd
jaedongjuly 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
首先strcpy用法不妥。
第一处复制的都是合法的值,第二处复制的是ascii为32的字符,即空格;
最后打印的一个是输入空格的前一个字符,一个是空格。
[/Quote]

我输入123456 可是puts出的两个结果一样。为什么?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧