新人请教C语言与c++语言的字符串问题

2017-05-06 02:29
PAT上的一道题目:

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入格式:

输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。

输出格式:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。

输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI


我的C代码:

 
  
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main ()
{
char right[85], fail[85], same[85];
int right_leng, fail_leng;
int i, j, count = 0, flag = 0;

scanf ("%s", right);
scanf ("%s", fail);
right_leng = strlen(right);
fail_leng = strlen(fail);
//将小写字母转换为大写
for (i=0; i<right_leng; i++) {
if (right[i]>='a' && right[i]<='z') {
right[i] -= 32;  
}
}
for (i=0; i<fail_leng; i++) {
if (fail[i]>='a' && right[i]<='z') {
fail[i] -= 32;
}
}
//排除相同的,留下没有的
for (i=0; i<right_leng; i++) {
for (j=0; j<fail_leng; j++) {
if (right[i] == fail[j]) {
flag = 1;
break;
}
}
for (j=0; j<count; j++) {
if (right[i] == same[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
same[count++] = right[i];
}
flag = 0;
}
printf ("%s", same);
return 0;
 }

我的c++代码:
 
  
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdlib.h>

using namespace std;

int main ()
{
char right[85], fail[85], same[85];
int right_leng, fail_leng;
int i, j, count = 0, flag = 0;

scanf ("%s", right);
scanf ("%s", fail);
right_leng = strlen(right);
fail_leng = strlen(fail);

for (i=0; i<right_leng; i++) {
if (right[i]>='a' && right[i]<='z') {
right[i] -= 32;
}
}

for (i=0; i<fail_leng; i++) {
if (fail[i]>='a' && right[i]<='z') {
fail[i] -= 32;
}
}

for (i=0; i<right_leng; i++) {
for (j=0; j<fail_leng; j++) {
if (right[i] == fail[j]) {
flag = 1;
break;
}
}
for (j=0; j<count; j++) {
if (right[i] == same[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
same[count++] = right[i];
}
flag = 0;
}
printf ("%s", same);
return 0;
 }

1.用C写,输出使用printf ("%s", same);只得到3分, 而用c++写 ,输出使用 printf ("%s", same);得了18分,c++代码中只加了
  using namespace std; 
  #include <iostream>
这是为什么呢?
2.当我的c和c++代码使用for (i=0; i<count; i++)  printf ("%c", same[i]);可以得满分。
这又是为什么?

回复讨论(解决方案)

1:
using namespace std;  //C++对所有的C++标准库都包含在std命名空间内,这里是说明对std内的所有在此都可见
#include <iostream> //这个头文件实际上也内含了 <stdio.h> <string.h><stdlib.h>等头文件

2:
得分不同是因为你的程序有未定义的代码,每次运行的结果是都不一定相同

printf ("%s", same) 
//打印C风格的字符串,以'\0'为结束标志。但是你的程序中并没有明确指出哪个地方是结束'\0',所以就导致第一处两个相同程序得出的结果不一样。

for (i=0; i<count; i++)  printf ("%c", same[i]);//打印字符


修正:
same[count] = ‘\0’; //增加这句代码,然后测试两个程序
printf ("%s", same);


1:
using namespace std;  //C++对所有的C++标准库都包含在std命名空间内,这里是说明对std内的所有在此都可见
#include <iostream> //这个头文件实际上也内含了 <stdio.h> <string.h><stdlib.h>等头文件

2:
得分不同是因为你的程序有未定义的代码,每次运行的结果是都不一定相同

printf ("%s", same) 
//打印C风格的字符串,以'\0'为结束标志。但是你的程序中并没有明确指出哪个地方是结束'\0',所以就导致第一处两个相同程序得出的结果不一样。

for (i=0; i<count; i++)  printf ("%c", same[i]);//打印字符


修正:
same[count] = ‘\0’; //增加这句代码,然后测试两个程序
printf ("%s", same);

谢谢~我还是太嫩了,期间有怀疑过count,但没想到字符串的结束符,代码量还是不够。