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

标签 c solaris

我正在尝试完成 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/

相关文章:

docker - Solaris 11.3上的Docker有哪些替代方案?

shell - 在 Solaris 上替代 `sed -i`

c++ - 混合 c 和 c++ 库(多 Unix 平台)

linker - 有没有办法知道哪个编译器生成了静态库?

c - 当我尝试对 2 个数组使用 scanf 时出现错误

c - 为什么SX1272的每个SPI寄存器与0x80进行或操作

c - pthread超时或取消,使用pthread_cond_timedwait,还是什么?

c - 链表行为 - 帮助我理解

使用 malloc 将 token 复制到二维数组

solaris - 在 QEMU 上模拟 Solaris 10 SPARC