-3
#include<stdio.h>
#include<string.h>
int main(void) {
    int t, n, i, j;
    char dir[41][52];
    char right[] = "Right";
    char left[] = "Left";
    char *p = NULL, storeDir[10], *k = NULL;
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        fflush(stdin);
        for(i = 0; i < n; i++) {
            gets(dir[i]);
            fflush(stdin);
        }
        i = n - 1;
        k = dir[i];
        j = 0;
        p = strchr(dir[i], 'o');
        while(*k != ' ') {
            storeDir[j] = *k;
            k++;
            j++;
        }
        storeDir[j] = '\0';
        printf("Begin ");
        printf("%s\n", p);
        for(i = n - 2; i  >= 0; i--) {
            if(strcmp(storeDir, right) == 0) {
                printf("Left ");
            }
            else if(strcmp(storeDir, left) == 0) {
                printf("Right ");
            }
            k = dir[i];
            j = 0;
            p = strchr(dir[i], 'o');
            while(*k != ' ') {
                storeDir[j] = *k;
                k++;
                j++;
            }
            storeDir[j] = '\0';
            printf("%s\n", p);
        }
        printf("\n");
    }
    return 0;
}

这是一个代码,它只接收一些字符串并通过使用指针操作它们来打印出来。它在我的计算机上运行良好,但是当我在 http://ideone.com/上运行它时,它会出现 SIGSEGV 错误。我认为这是由于一些无效的指针引用。但是,我无法弄清楚我哪里出错了。有人可以向我指出这一点吗?这是该程序的示例测试用例:

4
Begin on Road A
Right on Road B
Right on Road C
Left on Road D

TIA

4

1 回答 1

3
  1. 你正在使用gets()不要那样做
  2. 您没有检查错误代码;如果scanf()没有以完全正确的格式接收数据,n则不会有正确的值。
  3. 您没有检查错误代码:当strchr()找不到 a时o,它返回 NULL
  4. 您的“测试数据”没有正确的数据。将此与不进行错误检查相结合是灾难的根源。

这就是它出错的地方:您执行scanf()加载t,这未反映在您的“测试数据”中(这将表明 4 条记录,而实际上只列出了一条)。下一个字符是回车,它scanf()吃了但没有继续。

next scanf()to readn获取下一个字符,一个Newline,它不是一个数字,所以它失败了。

现在我们有一些随机数(无论堆栈上的什么)n,我们调用gets()它加载到一些随机dir[]槽中的一些数据:仍在输入队列中的字符是换行符,所以它返回一个空字符串。

strchr()找不到你期望的oin"on"时,它返回 NULL,然后我们取消引用 in storeDir,这是你的程序崩溃的地方:一个空指针异常。当然,除非你很幸运并gets()覆盖了一些数据,或者你的堆栈包含一个小到足以放入dir.

如果我给你的程序“正确”的数据,例如:

1 4 Begin on Road A
Right on Road B
Right on Road C
Left on Road D

您的程序成功完成。

于 2012-12-23T19:17:55.630 回答