在 C 代码中打印后,字符串出现“破碎”成多个部分

问题描述 投票:0回答:1

我用 C 编写了这段代码,您可以在其中键入一个单词或句子(char s[])和两个数字(l 代表左,r 代表右)。它应该将字符串分成 3 部分:1. 从开始到位置 l-1 ,2.从l到位置r-1和3。从r到end。然后将它们按以下顺序附加到临时字符串:3,2,1 并打印。当给出输入“quit”时,循环停止。一切似乎都工作得很好(我通过 chatgpt 检查了代码),但由于某种原因,当我将代码上传到 eagle(我们在大学使用它来对代码进行评分的网站),字符串被分开打印(第 3 部分,然后是第 2,1 部分),我只是不知道问题是什么。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
     int l, r, n, i;
     char s[1000];
     fgets(s, 1000, stdin);
     s[strcspn(s, "\n")] = '\0';
     while (strcmp(s, "quit") != 0) {
         scanf("%d %d", &l, &r);
         n = strlen(s);
         if (l < 0 || r >= n || l > r) {
            while (getchar() != '\n');
            continue;
         } 
         else {
             char *temp = (char *)malloc((n + 1) * sizeof(char));
             if (temp == NULL) {
                 return 1;
             }
             int j = 0;
             //printf("Copying Segment 1 (r..n): ");
             for (i = r; i < n; i++) {
                 temp[j++] = s[i];
                 //printf("%c", s[i]);
             }
             //printf("\n");
             //printf("Copying Segment 2 (l..r): ");
             for (i = l; i < r; i++) {
                 temp[j++] = s[i];
                //printf("%c", s[i]);
             }
             //printf("\n");

             //printf("Copying Segment 3 (0..l): ");
             for (i = 0; i < l; i++) {
                 temp[j++] = s[i];
                 //printf("%c", s[i]);
             }
             //printf("\n");
             temp[j] = '\0'; 
             printf("%s\n", temp);
             fflush(stdout);
             free(temp); 
         }
         while (getchar() != '\n'); 
         fgets(s, 1000, stdin);
         s[strcspn(s, "\n")] = '\0';
      }
      return 0;
 }

这是 eagle 的结果: enter image description here

c string printing printf dynamic-memory-allocation
1个回答
0
投票

您的代码对于恶劣条件并不稳健。这意味着,如果您在本地测试它并且不尝试给它提供奇怪的输入,一切都会好起来的。

但是,如果由于任何原因在行尾 (

\n
) 之前有不可打印的字符,您将把它们留在缓冲区中,并在第 3 部分和第 1-2 部分之间留出空格。根据 IO 配置,行可以以
"\r\n"
字符串结束。这会在第 3 部分和第 1 部分之间留下一个回车符。或者,根据您上传输入数据的方式,行尾可能会有空格字符。他们将在第 3 部分和第 1 部分之间再次休息。

如果同样的想法,你无法测试

fgets
scanf
的返回值。如果输入数据不是您所期望的,这可能足以获得无限循环。

这可能不是初学者所想的,因为当程序在给定预期输入时产生预期结果时,他们很高兴。但事实是,好程序和差程序之间的区别通常在于它们处理意外输入数据的方式。一个好的程序会检测到它并给出相关消息。当你在特定主题上进行实验时,这并不重要......直到出现问题为止。一旦得到意想不到的结果,就应该在每个输入函数之后添加测试,如果还不够,则添加跟踪打印。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.