在做学校留的pta作业题的时候,发生编译结果不一致的情况。pta编译器输出结果为三行-1,xcode以及vscode等其他编译器都可以实现运行。 希望能知道哪里出现了问题,感谢!
这是原题目:7-1 组织星期信息 (10 分)
输入一个正整数repeat (0<repeat<10),做repeat次下列运算:
定义一个指针数组将下面的星期信息组织起来,输入一个字符串,在表中查找,若存在,输出该字符串在表中的序号,否则输出-1。
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
输入输出示例:括号内为说明,无需输入输出
输入样例 (repeat=3) :
3
Tuesday
Wednesday
year
输出样例:
3
4
-1
//
// main.c
// cex5_pointers&structures
//
// Created by Eawen C. on 2022/4/24.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int repeat = 0;
scanf("%d", &repeat);
fflush(stdin);
static char a[10] = "Sunday";
static char b[10] = "Monday";
static char c[10] = "Tuesday";
static char d[10] = "Wednesday";
static char e[10] = "Thursday";
static char f[10] = "Friday";
static char g[10] = "Saturday";
char *pt[7] = {0};
char *pttmp = &a[0];
for (int i = 0; i < 7; i = i + 1)
{
pt[i] = pttmp;
pttmp = pttmp + 10;
}
int result[10] = {0};
int number = 0;
while (repeat)
{
fflush(stdin);
char input[1000] = {0};
// printf("type: \n");
fgets(input, 1000, stdin);
// printf("%s", input);
for (int i = 0; i < 7; i++)
{
int j = 0;
long deter = strlen(pt[i]);
while (deter != 0)
{
char *ptstore = pt[i];
while (input[j] == *pt[i])
{
pt[i]++;
deter--;
j++;
}
pt[i] = ptstore;
if (deter == 0)
{
result[number] = i + 1;
goto here;
}
else
{
break;
}
}
}
result[number] = -1;
here:
repeat--;
number++;
}
for (int i = 0; i < number; i++) {
printf("%d\n", result[i]);
}
return 0;
}
由于刚开始学习指针,没有用现成的strcmp,而是自己实现了一个比对方法,但是pta却跑不起来。
尽量避免使用goto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int repeat = 0,number = 0,i,j;
scanf("%d", &repeat);
char *arr[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int *result = (int*)malloc(repeat*sizeof(int));
char input[1000];
while (number < repeat)
{
fflush(stdin);
// printf("type: \n");
//fgets(input, 1000, stdin);
scanf("%s",input);
// printf("%s", input);
for (i = 0; i < 7; i++)
{
j = 0;
while (arr[i][j] && input[j])
{
if(arr[i][j] != input[j])
break;
j++;
}
if(!(arr[i][j] && input[j])) //相同
{
result[number]=i+1;
break;
}
}
if(i==7)
result[number]=-1;
number++;
}
for (int i = 0; i < repeat; i++) {
printf("%d\n", result[i]);
}
return 0;
}
题主考虑的太复杂了,换种写法,供参考:
#include <stdio.h>
#include <string.h>
int main()
{
int repeat = 0, i, flg;
//定义一个指针数组将星期信息组织起来
char* pweek[7] = { "Sunday" ,"Monday" ,"Tuesday" ,"Wednesday" ,"Thursday" ,"Friday" ,"Saturday" };
char str[10] = { 0 }; //定义一个字符串
scanf("%d", &repeat);
while (repeat--) {
scanf("%s", str);
for (i = 0, flg = -1; i < 7; i++) {
if (strcmp(pweek[i], str) == 0) {
flg = i + 1;
break;
}
}
printf("%d\n", flg);
}
return 0;
}
问题已经解决了哈,应该是pta后台所用编译机器(可能是Linux系统等问题),使原代码中的这一部分:
static char a[10] = "Sunday";
static char b[10] = "Monday";
static char c[10] = "Tuesday";
static char d[10] = "Wednesday";
static char e[10] = "Thursday";
static char f[10] = "Friday";
static char g[10] = "Saturday";
char *pt[7] = {0};
char *pttmp = &a[0];
for (int i = 0; i < 7; i = i + 1)
{
pt[i] = pttmp;
pttmp = pttmp + 10;
}
无法正常执行并赋值。受楼上老哥启发,把赋值部分改写成:
char *pt[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
即可正常编译并通过了。
下面是修改后的全部代码:
//
// main.c
// cex5_pointers&structures
//
// Created by Eawen C. on 2022/4/24.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int repeat = 0;
scanf("%d", &repeat);
fflush(stdin);
char *pt[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int result[10] = {0};
int number = 0;
while (repeat)
{
fflush(stdin);
char input[1000] = {0};
// printf("type: \n");
scanf("%s", input);
//fgets(input, 1000, stdin);
// printf("%s", input);
for (int i = 0; i < 7; i++)
{
int j = 0;
long deter = strlen(pt[i]);
while (deter != 0)
{
char *ptstore = pt[i];
while (input[j] == *pt[i] &&input[j]!=0)
{
pt[i]++;
deter--;
j++;
}
pt[i] = ptstore;
if (deter == 0)
{
result[number] = i + 1;
}
else
{
break;
}
}
}
repeat--;
number++;
}
for (int i = 0; i < number; i++) {
if (result[i] == 0) {
result[i] = -1;
}
printf("%d\n", result[i]);
}
return 0;
}