星 s t a r 2024-02-10 17:34 采纳率: 33.3%
浏览 12

牛客网 C/C++ KY91 一个奇怪的bug

C语言一行输入多个字符串(全小写字母),为什么程序跑着跑着字符串就变成了乱码?

具体题目是:牛客网上,考研机试题目各校真题,KY91,“String Matching”。链接如下:https://www.nowcoder.com/practice/00438b0bc9384ceeb65613346b42e88a?tpId=40&tqId=21422&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan&difficulty=&judgeStatus=&tags=/question-ranking
(之前标题里面搞错了,写成KY168了,应该是KY91,现在改过来了)

前3张图片是代码,main()函数里面我用了一堆printf(),因为输入的两个字符串在后续使用的时候出了问题,第4张图片是牛客网的输出,在调用get_next()函数后,明明不关text[]数组的事儿,但是text[]数组在之后莫名其妙地变成了乱码,而我在本地运行的话,运行了3次,一直都是正常,如图片5。 朋友们帮忙分析下,到底是哪儿出了问题?
(尝试过是不是输入格式的问题,但是text[]和pattern[]分开输入之后,bug依然存在)

img

img

img

img

img

后续:还是没有发现问题所在,调试了几乎一个下午,发现这个bug会呈现各种稀奇古怪的形式,因为挺离奇的,就不再这里一一赘述了,最终姑且认为是牛客网的问题,算它过了!
如果有哪位友友发现了问题真正所在,欢迎前来指导或讨论。

另:附上代码

#include<stdio.h>
#include<string.h>
using namespace std;

void get_next(char pattern[], int next[]){
    int j = 0, k = -1;
    next[j] = k;
    while(j < strlen(pattern)){
        if(k == -1 || pattern[j] == pattern[k]){
            j++;
            k++;
            next[j] = k;
        }else{
            k = next[k];
        }
    }
}
int KMP_2nd(char text[], char pattern[], int next[]){
    int i = 0, j = 0, cnt = 0;
    while(i < strlen(text)){
        if(j == -1 || text[i] == pattern[j]){
            i++;
            j++;
        }else{
            j = next[j];
        }
        if(j == strlen(pattern)){
            cnt++;
            j = next[j];
        }
    }
    return cnt;
}

int main(){
    char text[1000001], pattern[1000001];
    while(scanf("%s %s", text, pattern) != EOF){
        int next[strlen(pattern)];
        get_next(pattern, next);
        int cnt = KMP_2nd(text, pattern, next);
        printf("%d\n", cnt);
    }

    return 0;
}

—— ~ ~——
后记:大概两个月后我再次做了下,这次的代码与上次基本相同,没有报错,也许上次是牛客网临时卡了个bug?

  • 写回答

3条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-02-10 17:36
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    从您描述的情况来看,这个问题可能与牛客网在线编程环境的特性有关,特别是输入和输出缓冲区处理方面。在C语言中,特别是在处理多行字符串输入时,如果不正确地使用scanf()fgets()等函数来读取输入数据,可能会导致未读完的数据留在输入缓冲区内,进而影响后续的输入操作。

    由于您提到本地运行没有问题,而在牛客网上出现问题,这很可能是因为在线环境下的输入缓冲区管理方式不同所引起的。例如,当一行内输入多个字符串且没有正确读取换行符或者读取了固定长度但字符串实际长度超出预期时,可能会引发乱码现象。

    对于您的代码(虽然我无法直接查看图片),建议:

    1. 确保每次读取字符串后清空输入缓冲区,可以使用如下代码:

      int c;
      while ((c = getchar()) != '\n' && c != EOF) {}
      
    2. 使用fgets()函数替代scanf()来读取字符串,因为fgets()可以更好地控制读取整个行,并且能防止缓冲区溢出。同时,记得检查字符串末尾的换行符并去除,以免干扰后续逻辑。

    3. 检查数组定义的大小是否足够容纳输入的字符串,包括结束符\0

    4. 如果get_next()函数内部有修改text[]数组的操作,确保这些操作是正确的,不会越界写入内存。

    鉴于具体代码细节未知,以上仅为推测性分析和一般性建议。请根据实际情况调整代码以适应牛客网的在线编译器环境。

    评论

报告相同问题?

问题事件

  • 修改了问题 5月28日
  • 修改了问题 2月19日
  • 修改了问题 2月19日
  • 修改了问题 2月19日
  • 展开全部