gpt4 book ai didi

c - Solaris 编译器使我的 C 代码行为异常

转载 作者:太空宇宙 更新时间:2023-11-04 00:17:17 25 4
gpt4 key购买 nike

我正在尝试完成 C 编程科目的大学作业。

我已经在我的 MacBook 上完成了我的任务,并且我的代码可以完美地工作。然而,我们的讲师告诉我们,我们所有的代码都将使用学院的 Solaris 10 服务器编译,并且我们被告知,如果您的代码无法在其上编译和运行,将被扣分。

我们还被告知我们的应用程序将由具有以下语法的标记编译:

gcc -ansi -Wall -pedantic assign1.c -lm -o assign1

并执行使用:

./assign1

我的代码目前编译时没有错误或警告,并且可以正常执行。但是,我的一个功能在这个 Solaris 机器上没有按预期工作。该函数应该是我们自己实现的基本字符串排序 - 用户输入一个最长 40 个字符的字符串,它应该被转换为小写字母并按字母顺序排序,并删除所有非字母字符。

在我的 Mac 上,它输出:

Enter a string (1-40 characters): asdfghjkl
Output: adfghjkls

在学院的 Solaris 盒子上,它输出:

Enter a string (1-40 characters): asdfghjkl
Output: aa#?dfghjkls

我执行(大部分)输出的函数是:

void sortLine(int *optionStats, char* source)
{
char tempsort[MAX_SORT_LENGTH + 1];
char comp_c;
int i,j,k;
char c = source[i++];
i = j = k = 0;
optionStats[2]++;
while (c != '\n' && c != '\0' && c != EOF) {
/* convert uppercase characters to lowercase */
if ((int)c >= (int)'A' && (int)c <= (int)'Z')
c = c + ((int)'a' - (int)'A');
/* if the character is alphabeic then sort it else skip it */
if ((int)c <= (int)'z' && (int)c >= (int)'a') {
for (j = 0; j <= MAX_SORT_LENGTH + 1; j++) {
comp_c = tempsort[j];
if (comp_c == '\n' || comp_c == '\0' || comp_c == EOF) {
tempsort[j] = c;
break;
}
if ((int)c <= (int)comp_c) {
for (k = MAX_SORT_LENGTH + 1; k > j; k--) {
tempsort[k] = tempsort[k - 1];
}
tempsort[j] = c;
break;
}
}
}
c = source[i++];
}
/* copy the sorted temporary array into the source array */
for (i = 0; i <= MAX_SORT_LENGTH + 1; i++) {
source[i] = tempsort[i];
}
}

但有几点要注意:

  • 函数定义本身(签名)由讲师,所以名字,返回类型,参数等不能更改。我们必须按原样使用它(但是我们可以在里面做任何我们想做的事)。

  • 代码必须符合 ANSI/C90(呃!)

谁能帮我找出是什么导致这些奇怪的额外字符从这个函数中吐出 - 它让我头疼?

最佳答案

int i,j,k;
char c = source[i++];
i = j = k = 0;

在为它赋值之前,您正在使用 i。您不能假设自动变量将被初始化为 0

while (c != '\n' && c != '\0' && c != EOF) {

因为 c 是一个 char,它永远不可能等于 EOF。不相关,但总有一天你会看到这个错误 :) 你必须为这个习惯用法使用 int:

int c;

while((c=getchar()) != EOF) {
/* process c */
}

您也在 tempsort[] 初始化之前使用它:

        comp_c = tempsort[j];

您正在将大量数据写回source[]数组:

for (i = 0; i <= MAX_SORT_LENGTH + 1; i++) {
source[i] = tempsort[i];
}

我希望 source[] 数组保证足够大以容纳 MAX_SORT_LENGTH 数据,而不是仅仅足够大持有一个标准的 C 字符串。由于这可能是一位友好的教授,所以可能没问题,但这不是我会轻易做出的假设。

作为最后的提示,每一个 (int) 转换都是无用的;编译器知道如何对 char 变量进行比较和运算。 :)

关于c - Solaris 编译器使我的 C 代码行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5547214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com