dotcpp第2961题
题目描述
一个以'.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式,求句子中的最长单词。
代码如下:
s = input()[:-1].strip().split()
print(max(s, key = len))
提交报运行错误:运行时错误,非法的内存访问,数组越界,指针漂移,调用禁用的系统函数。
请教一下这个代码有什么问题?
dotcpp第2961题
题目描述
一个以'.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式,求句子中的最长单词。
代码如下:
s = input()[:-1].strip().split()
print(max(s, key = len))
提交报运行错误:运行时错误,非法的内存访问,数组越界,指针漂移,调用禁用的系统函数。
请教一下这个代码有什么问题?
上午好☀️☀️☀️️
本答案参考通义千问
你提供的代码在处理输入时存在潜在的问题,导致运行时错误(非法内存访问、数组越界等)。以下是详细分析和解决方案:
你的代码如下:
s = input()[:-1].strip().split()
print(max(s, key=len))
input() 的输入格式问题题目描述中提到:“一个以 '.' 结尾的简单英文句子”,也就是说输入字符串应该以 . 结尾。
例如:
输入为 "Hello world.",那么 input() 得到的是 "Hello world.\n"(如果用户是通过回车输入的话),或者直接是 "Hello world."。
但你使用了 input()[:-1],这会将最后一个字符(即 .)去掉,然后进行 strip() 和 split() 操作。
问题点:当输入字符串长度为0或只有
.时,input()[:-1]可能导致索引越界。
如果用户输入为空或者只包含 .,那么:
input() 是 ".",input()[:-1] 就是 "";strip() 会变成 "";split() 会得到一个空列表 [];max([]) 会抛出 ValueError: max() arg is an empty sequence。这会导致程序崩溃。
为了确保代码的健壮性,我们需要做以下几点:
.;s = input().strip()
# 去除结尾的 '.'(如果有的话)
if s.endswith('.'):
s = s[:-1]
words = s.split()
if words:
print(max(words, key=len))
else:
print("没有单词")
加粗重点部分:
input().strip():防止输入中有前导或后导空格。s.endswith('.'):判断是否以 . 结尾,避免直接切片导致越界。if words::确保列表不为空,避免调用 max() 报错。max(words, key=len):正确找出最长单词。| 输入 | 输出 |
|------------------|------------|
| Hello world. | Hello |
| This is a test.| This |
| . | 没有单词 |
| Hello . | Hello |
你的原代码在某些边界情况下(如输入为空或只有 .)会导致 运行时错误。建议使用上述修改后的代码,确保程序的健壮性和稳定性。