我用 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;
}
您的代码对于恶劣条件并不稳健。这意味着,如果您在本地测试它并且不尝试给它提供奇怪的输入,一切都会好起来的。
但是,如果由于任何原因在行尾 (
\n
) 之前有不可打印的字符,您将把它们留在缓冲区中,并在第 3 部分和第 1-2 部分之间留出空格。根据 IO 配置,行可以以 "\r\n"
字符串结束。这会在第 3 部分和第 1 部分之间留下一个回车符。或者,根据您上传输入数据的方式,行尾可能会有空格字符。他们将在第 3 部分和第 1 部分之间再次休息。
如果同样的想法,你无法测试
fgets
和scanf
的返回值。如果输入数据不是您所期望的,这可能足以获得无限循环。
这可能不是初学者所想的,因为当程序在给定预期输入时产生预期结果时,他们很高兴。但事实是,好程序和差程序之间的区别通常在于它们处理意外输入数据的方式。一个好的程序会检测到它并给出相关消息。当你在特定主题上进行实验时,这并不重要......直到出现问题为止。一旦得到意想不到的结果,就应该在每个输入函数之后添加测试,如果还不够,则添加跟踪打印。