马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Hermione 于 2017-12-11 21:41 编辑
1实现作业strcpy进阶时:#include <stdio.h>
#define MAX 1024
int main()
{
char str1[MAX];
char str2[MAX];
char *target1 = str1;
char *target2 = str2;
char ch;
int n;
printf("请输入一个字符串到 str1 中:");
fgets(str1, MAX, stdin);
printf("请输入需要拷贝的字符个数:");
scanf("%d", &n);
printf("开始拷贝 str1 的内容到 str2 中...\n");
while (n--)
{
ch = *target2++ = *target1++;
if (ch == '\0')
{
break;
}
if ((int)ch < 0)
{
*target2++ = *target1++;
*target2++ = *target1++;
}
}
*target2 = '\0';
printf("拷贝完毕!\n");
printf("现在,str2 中的内容是:%s\n", str2);
return 0;
}
1.汉字是3个字节,那么25行开始ch读到的到底是什么?32、33行是因为汉字3个字节,就要读2次吗?如果汉字是2个(如果),就只用再追加一次对么?另外,我的编译器,汉字只有2个字节,我输入“哈哈”,sizeof是5?
最新情况:我发现:无论32、33行,我弄一次还是弄两次,居然都没问题,这是怎么回事啊!!!#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string>
#include <cstring>
#define MAX 1024
using namespace std;
int main()
{
char v1[MAX];
char v2[MAX];
char *a = v1;
char *b = v2;
fgets(v2, MAX, stdin);
cout << "个数:";
int n;
cin >> n;
char ch;
while(n--)
{
ch = (*b++ == *a++);
if(ch == '\0')
break;
if((int)ch < 0)
{
*a++ = *b++;
//*a++ = *b++;
}
}
cout << v2;
}
2.第二个问题是:字符数组,用fgets,真实结尾是既有'\0'又有'\n'么?作业是这么说的,因为strcat里面指针-2了,但是如果我数组大小取5,我还是可以顺利读取4个字符,如果既包含'\0',又包含'\n',应该只能读取3个字符呀?
第一个问题:
1 25行开始读的就是target1中的一个字符的值
2 汉字是3个字节,因为前面读了一次,所以还要继续读两次,凑成三个字节
3 如果你的编译器中的汉字是两个字节,那么只要继续读一次
4 最新发现:正常,因为拷贝过程没有实时呈现结果,所以不管你一次读1个还是3个,或者5个,只要不越界,结果就是一样的。
第二个问题:
如果长度不够,就会扔了'\n',溢出的都扔了,比如长度为5,你输入了8个字符,实际只能存放4个
|