0

我正在解决一个读取一组文本行并打印最长的问题。问题来自K&R “The C 编程语言”第 1.9 节。这本书提供了一个解决方案,但我试图以自己的方式解决它。下面的代码可以工作,但在我开始工作之前,我遇到了一个问题,longestStr[i++] = tmpStr[j++]因为我之前使用过的线路longestStr[i++] = tmpStr[i++]认为i一旦分配完成就会增加。但事实并非如此。这是后缀运算符通常的工作方式吗?

#include <stdio.h>
#define MAXLINE 100


main()
{
    int lineLength = 0, longestLine = 0;
    int c, i, j;
    char longestStr[MAXLINE];
    char tmpStr[MAXLINE];

    while((c = getchar()) != EOF)
    {
        tmpStr[lineLength++] = c;
        if(c == '\n')
        {
            if( lineLength > longestLine)
            {
                longestLine = lineLength;
                i = 0, j = 0;
                while(i < lineLength)
                {
                    longestStr[i++] = tmpStr[j++]; // I tried longestStr[i++] = tmpStr[i++] but it gives wrong result
                }               
            }
            lineLength = 0;
        }       
    }
    printf("Longest line is - %d long\n", longestLine-1);
    for(i = 0; i < longestLine-1; i++)
        printf("%c", longestStr[i]);
    putchar('\n');
}
4

4 回答 4

3

后缀递增或递减是在使用变量后执行递增或递减的运算符,因此如果您希望使用整数值打印出来并同时添加它,您将使用后缀。

int i = 0;
printf("%d",i++);
//prints out 0

然而,前缀递增/递减以相反的方式工作,因此它在使用变量之前执行递增/递减,因此如果您希望在打印之前递增/递减变量,您将使用前缀

int i = 0;
printf("%d",++i);
//prints out 1
于 2013-06-30T07:03:52.833 回答
1

尝试了解修复后增量的工作原理。

f(i++) 等价于操作“在 i 的当前值上调用 f,然后递增 i”

例如,当你两次使用 i++ 时, 的初始值i = 1a(i++) = b(i++)表示,a(1)=b(2)操作后的 i 的值为i=3

如果你想在你试图做的事情中消除一个变量,你必须确保你只使用一次增量。喜欢做,a(i)=(b(i); i++

于 2013-06-30T07:07:43.800 回答
1

您遇到的问题与后缀运算符的工作方式无关,而是与您打算在给您带来问题的代码行中执行的操作有关。

正如评论中所问的,你最初写的那行是什么意思?

longestStr[i++] = tmpStr[i++];

因为 C 标准没有指定它,所以可以用几种方式解释这一行:

longestStr[i] = tmpStr[i+1];
i += 2;

或者

longestStr[i+1] = tmpStr[i];
i += 2;

或者

longestStr[i] = tmpStr[i];
i += 2;

在每种情况下,您最终都会得到一个计数器增加两次,这会弄乱您的算法。

正确的方法是在单独的行中增加计数器,或者使用工作解决方案(您提供),应该使用任何体面的编译器将其编译为相同的代码。

请注意,您可能应该检查计数器是否超出允许的最大行大小MAXLINE(除非问题表明输入不会发生这种情况,但即使在这种情况下,它也会对像您这样的情况有所帮助,其中代码错误地递增计数器两次)。

于 2013-06-30T07:27:57.307 回答
0

虽然后缀增量运算符评估原始值,但认为实际的增量直到某个时候才会发生是可以理解的。然而,这种情况并非如此。您应该将后缀概念化,就好像在返回原始值时发生递增一样。

不过,更大的问题是您的语句将 i 增加了两次。这意味着我将随着循环的每次迭代而增加 2。此外,您的索引值将彼此相差一个,这是因为如果变量在语句评估的一部分期间发生变化,则这些更改会立即对尚未评估的语句部分可见。

于 2013-06-30T07:57:27.720 回答