问题是当我给予一个代码时,它并不显示任何输出,它只是挂起。我只是不明白为什么代码不工作。是C语言的局限性还是代码有什么问题?到底是什么导致了这个问题?
对于以下输入:
2
http:\\lightoj.com
该程序用于输出:
https:\\lightoj.com
但它什么也没做,我认为问题是在for循环中声明多个变量,因为如果我不在else内部的循环中使用多个变量(而不是for(int j = 0, k = 0; j < l; j++, k++)
,使用for(int j = 0; j < l; j++)
),那么代码会显示输出(当然不是预期的输出)。
#include <stdio.h>
#include <string.h>
int main()
{
int T, n;
scanf("%d", &T); // Test Case
for (int i = 0; i < T; i++) // Test case loop
{
char *s;
scanf("%s", s); // taking a string
if (s[4] == 's') // if the text has (https:\\lightoj.com) 's' in 4th index then it will //print the string as it is
{
printf("Case %d: %s\n", i+1, s);
}
else
{
printf("Case %d: ", i + 1);
int l = strlen(s);
for (int j = 0, k = 0; j < l; j++, k++)
{
if (k == 4)
{
printf("s"); // In the forth index printing s
j--; // changing j = 4 to j = 3
}
else
{
// printf("i = %d j = %d\n", i, j);
printf("%c", s[j]);
// printing each character of (http:\\lightoj.com) to (https:\\lightoj.com)
}
}
printf("\n");
}
}
}
我确实尝试了很多方法来找出问题的确切位置。所以我首先检查多变量循环是否有任何问题。结果它工作了。没有测试用例循环。如下所示
1)单独检查
#include <stdio.h>
#include <string.h>
int main()
{
//without the test case loop the program works fine. It gives proper output
int i = 0;
char *s;
scanf("%s", s);
if (s[4] == 's') {
printf("%s\n", s);
}
else
{
printf("Case %d: ", i + 1);
int l = strlen(s);
for (int j = 0, k = 0; j < l; j++, k++)
{
if (k == 4)
{
printf("s");
j--;
}
else
{
// printf("i = %d j = %d\n", i, j);
printf("%c", s[j]);
}
}
printf("\n");
}
}
1.但是如果我在另一个循环(测试用例循环)中尝试相同的代码,那么它不会显示输出。
#include <stdio.h>
#include <string.h>
int main()
{
int T, n;
scanf("%d", &T);
for (int i = 0; i < T; i++)
{
char *s;
scanf("%s", s);
if (s[4] == 's')
{
printf("Case %d: %s\n", i+1, s);
}
else
{
printf("Case %d: ", i + 1);
int l = strlen(s);
for (int j = 0, k = 0; j < l; j++, k++)
{
if (k == 4)
{
printf("s");
j--;
}
else
{
// printf("i = %d j = %d\n", i, j);
printf("%c", s[j]);
}
}
printf("\n");
}
}
}
1.在测试用例循环中,如果我将for(int j = 0, k = 0; j < l; j++, k++)
更改为for(int j = 0; j < l; j++)
,它会工作,但我无法使用我的逻辑来解决问题。
#include <stdio.h>
#include <string.h>
int main()
{
int T, n;
scanf("%d", &T);
for (int i = 0; i < T; i++)
{
char *s;
scanf("%s", s);
if (s[4] == 's')
{
printf("Case %d: %s\n", i+1, s);
}
else
{
printf("Case %d: ", i + 1);
int l = strlen(s);
for (int j = 0; j < l; j++)
{
if (j == 4)
{
printf("s");
// j--;
}
else
{
// printf("i = %d j = %d\n", i, j);
printf("%c", s[j]);
}
}
printf("\n");
}
}
}
2条答案
按热度按时间goucqfw61#
至少这些问题:
未初始化的指针
代码将缺少指定值的
s
传递给scanf()
。因此,结果是 * 未定义的行为 *(UB)。相反,使用一个大数组、一个 width 限制并检查返回值。
一个更好的选择是使用
fgets()
-尽管在前面的scanf("%d", &T);
之后会有问题。最好在整个过程中使用fgets()
。测试垃圾
除非
s
中的 string 足够长,否则应尝试使用if (s[4] == 's')
。nhaq1z212#
问题是你的代码有未定义的行为:为
%s
转换说明符传递一个指向scanf()
的未初始化指针:未定义的行为意味着任何事情都可能发生。正如你所观察到的,你的程序可能会停止,并伴随或不伴随错误信息。
您应该将
s
定义为数组,指定要存储到数组中的最大字符数,并测试输入失败:还请注意,可以使用测试和
printf
语句解决此问题。以下是修改后的版本: