天道酬勤,学无止境

“未知”与“任何”('unknown' vs. 'any')

问题

根据他们的Wiki,TypeScript 3.0引入了unknown类型:

未知现在是保留类型名称,因为它现在是内置类型。 根据未知的预期用途,您可能希望完全删除声明(支持新引入的未知类型),或将其重命名为其他名称。

unknownanyany什么不一样? 我们什么时候应该使用unknownany

回答1

您可以在PR或RC公告中阅读有关unknown更多信息,但要点是:

[..] unknown是任何类型安全的对应物。 任何东西都可以分配给未知对象,但是除了自身以及没有类型声明或基于控制流的缩小对象之外,任何东西都不能分配给其他对象。 同样,在未先声明或缩小为更具体的类型之前,不允许对未知数执行任何操作。

几个例子:

let vAny: any = 10;          // We can assign anything to any
let vUnknown: unknown =  10; // We can assign anything to unknown just like any 


let s1: string = vAny;     // Any is assignable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

建议的用法是:

很多时候,我们想在TypeScript中描述功能最差的类型。 这对于希望表示“可以是任何值,因此在使用它之前必须执行某种类型的检查”的API很有用。 这迫使用户安全地检查返回的值。

回答2

未知与任意之间的区别描述为:

就像any一样,任何值都可以分配给unknown ; 但是,与any不同,您无法访问类型为unknown值的任何属性,也不能调用/构造它们。 此外, unknown类型的值只能分配给unknownany

要回答有关何时应在any使用unknown问题:

这对于希望表示“可以是任何值,因此在使用它之前必须执行某种类型的检查”的API很有用。 这迫使用户安全地检查返回的值。

查看TypeScript 3.0公告,了解有关检查类型为unknown的变量的类型的示例以及更详细的说明。

回答3

any类型:

any类型表示所有可能的JS值。 每种类型都可以分配为any类型。 因此, any类型是类型系统的通用超类型。 TS编译器将允许对类型为any值进行任何操作。 例如:

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

在很多情况下,这对于TS编译器来说太宽容了。 即它将允许我们原本会导致运行时错误的操作。

unknown类型:

unknown类型表示(就像any类型一样)所有可能的JS值。 每个类型都可以分配给unknown类型。 因此, unknown类型是类型系统的另一个通用超类型(以及any )。 然而,TS编译器将不允许价值观的任何操作类型unknown 。 此外, unknown类型只能分配给any类型。 一个例子将阐明这一点:

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
回答4

任何未知:

  • 允许分配任何类型

任何:

  • 允许分配给任何类型
  • 确实允许调用任何方法

未知:

  • 不允许分配给任何类型
  • 不允许调用任何方法
const a: any = 'a'; // OK
const b: unknown = 'b' // OK

const v1: string = a; // OK
const v2: string = b; // ERROR
const v3: string = b as string; // OK

a.trim() // OK
b.trim() // ERROR

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • const vs constexpr的变量(const vs constexpr on variables)
    问题 以下定义之间有区别吗? const double PI = 3.141592653589793; constexpr double PI = 3.141592653589793; 如果不是,在C ++ 11中首选哪种样式? 回答1 我相信有区别。 让我们重命名它们,以便我们可以更轻松地讨论它们: const double PI1 = 3.141592653589793; constexpr double PI2 = 3.141592653589793; PI1和PI2都是常量,这意味着您无法对其进行修改。 但是,只有PI2是编译时常量。 它应在编译时初始化。 PI1可以在编译时或运行时初始化。 此外,在需要编译时常数的上下文中,只能使用PI2 。 例如: constexpr double PI3 = PI1; // error 但: constexpr double PI3 = PI2; // ok 和: static_assert(PI1 == 3.141592653589793, ""); // error 但: static_assert(PI2 == 3.141592653589793, ""); // ok 至于您应该使用哪个? 使用满足您需求的任何一种。 是否要确保您有一个可在需要编译时常数的上下文中使用的编译时常数?
  • 为什么NULL = NULL在SQL Server中评估为false(Why does NULL = NULL evaluate to false in SQL server)
    问题 在SQL Server中,如果where子句中具有nullParam=NULL ,则该值始终为false。 这是违反直觉的,并导致了我很多错误。 我确实了解IS NULL和IS NOT NULL关键字是正确的方法。 但是,为什么SQL Server会以这种方式表现呢? 回答1 Think of the null as "unknown" in that case (or "does not exist"). In either of those cases, you can't say that they are equal, because you don't know the value of either of them. So, null=null evaluates to not true (false or null, depending on your system), because you don't know the values to say that they ARE equal. This behavior is defined in the ANSI SQL-92 standard. EDIT: This depends on your ansi_nulls setting. if you have ANSI_NULLS off, this
  • NOT IN子句中的NULL值(NULL values inside NOT IN clause)
    问题 当我获得了不同的记录计数时,就出现了这个问题,我认为这是相同的查询,一个使用一个not in where约束,另一个使用left join 。 not in约束中的表具有一个空值(错误数据),该空值导致该查询返回0条记录的计数。 我有点理解为什么,但是我可以使用一些帮助来完全理解这个概念。 简单地说,为什么查询A返回结果而B不返回结果? A: select 'true' where 3 in (1, 2, 3, null) B: select 'true' where 3 not in (1, 2, null) 这是在SQL Server 2005上进行的。我还发现调用set ansi_nulls off会导致B返回结果。 回答1 查询A与以下内容相同: select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null 由于3 = 3为真,因此您会得到一个结果。 查询B与以下内容相同: select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null ansi_nulls时, 3 <> null为UNKNOWN,因此该谓词的计算结果为UNKNOWN,并且您不会获得任何行。 关闭ansi_nulls时, 3 <> null为true,因此谓词的值为true,您将获得一行。 回答2
  • 我收到“针对(未知URL):0未知错误的Http故障响应”,而不是Angular中的实际错误消息(I get “Http failure response for (unknown url): 0 Unknown Error” instead of actual error message in Angular)
    问题 我正在使用Angular 4 HttpClient将请求发送到外部服务。 这是一个非常标准的设置: this.httpClient.get(url).subscribe(response => { //do something with response }, err => { console.log(err.message); }, () => { console.log('completed'); } 问题是,当请求失败时,我会看到Http failure response for (unknown url): 0 Unknown Error的通用Http failure response for (unknown url): 0 Unknown Error控制台中出现Http failure response for (unknown url): 0 Unknown Error消息。 同时,当我检查Chrome中失败的请求时,我可以看到响应状态为422,并且在“预览”选项卡中,我看到了描述失败原因的实际消息。 如何访问我在chrome开发工具中看到的实际响应消息? 这是演示问题的屏幕截图: 回答1 问题与CORS有关。 我注意到Chrome控制台中还有另一个错误: 所请求的资源上没有“ Access-Control-Allow-Origin”标头。 因此,不允许访问源“
  • 警告:preg_replace():未知修饰符(Warning: preg_replace(): Unknown modifier)
    问题 我有以下错误: 警告:preg_replace():第38行上xxx.php中的未知修饰符']' 这是第38行的代码: <?php echo str_replace("</ul></div>", "", preg_replace("<div[^>]*><ul[^>]*>", "", wp_nav_menu(array('theme_location' => 'nav', 'echo' => false)) )); ?> 我该如何解决这个问题? 回答1 为什么会发生错误 在PHP中,正则表达式需要包含在一对定界符内。 分隔符可以是任何非字母数字,非反斜杠,非空格字符; / , # , ~是最常用的。 注意,也可以使用括号样式定界符,其中左括号和右括号是开始和结束定界符,即<pattern_goes_here> , [pattern_goes_here]等均有效。 在以下两种情况下,通常会发生“未知修饰符X ”错误: 当您的正则表达式缺少分隔符时。 当您在模式中使用定界符而没有转义时。 在这种情况下,正则表达式为<div[^>]*><ul[^>]*> 。 正则表达式引擎将<到>所有内容都视为正则表达式模式,之后的所有内容均视为修饰符。 Regex: <div[^> ]*><ul[^>]*> │ │ │ │ └──┬──┘ └────┬─────┘ pattern
  • 如何在TypeScript中将字符串转换为枚举?(How do I convert a string to enum in TypeScript?)
    问题 我在TypeScript中定义了以下枚举: enum Color{ Red, Green } 现在在我的函数中,我将颜色作为字符串接收。 我尝试了以下代码: var green= "Green"; var color : Color = <Color>green; // Error: can't convert string to enum 我如何将该值转换为枚举? 回答1 TypeScript 0.9中的枚举基于字符串+数字。 对于简单的转换,您不需要类型断言: enum Color{ Red, Green } // To String var green: string = Color[Color.Green]; // To Enum / number var color : Color = Color[green]; 在线尝试 我在OSS书中有关于此枚举模式和其他枚举模式的文档:https://basarat.gitbook.io/typescript/type-system/enums 回答2 从Typescript 2.1开始,枚举中的字符串键是强类型的。 keyof typeof用于获取有关可用字符串键(1)的信息: enum Color{ Red, Green } let typedColor: Color = Color.Green; let
  • 未知错误:在ubuntu上执行Selenium UI测试用例时,DevToolsActivePort文件不存在错误(unknown error: DevToolsActivePort file doesn't exist error while executing Selenium UI test cases on ubuntu)
    问题 我也有具有UI的ubuntu服务器。 您可以通过触发mvn test命令来执行测试用例。 但是问题是,当我通过终端从另一台机器对ssh进行机器操作时,出现以下错误- unknown error: DevToolsActivePort file doesn't exist (Driver info: chromedriver=2.40.565383 (76257d1ab79276b2d53ee976b2c3e3b9f335cde7),platform=Linux 4.4.0-121-generic x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 60.04 seconds Build info: version: '3.8.1', revision: '6e95a6684b', time: '2017-12-01T18:33:54.468Z' System info: host: 'ubuntu-test', ip: 'X.X.X.X', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-121-generic', java.version: '1.8.0_171'
  • 带有JSON的Jackson:无法识别的字段,未标记为可忽略(Jackson with JSON: Unrecognized field, not marked as ignorable)
    问题 我需要将某个JSON字符串转换为Java对象。 我正在使用Jackson进行JSON处理。 我无法控制输入的JSON(我从Web服务读取)。 这是我输入的JSON: {"wrapper":[{"id":"13","name":"Fred"}]} 这是一个简化的用例: private void tryReading() { String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}"; ObjectMapper mapper = new ObjectMapper(); Wrapper wrapper = null; try { wrapper = mapper.readValue(jsonStr , Wrapper.class); } catch (Exception e) { e.printStackTrace(); } System.out.println("wrapper = " + wrapper); } 我的实体类是: public Class Student { private String name; private String id; //getters & setters for name & id here } 我的包装程序类基本上是一个容器对象,用于获取我的学生列表:
  • 子句在何处的未知列(Unknown Column In Where Clause)
    问题 我有一个简单的查询: SELECT u_name AS user_name FROM users WHERE user_name = "john"; 我Unknown Column 'user_name' in where clause获得Unknown Column 'user_name' in where clause 。 我不能引用'user_name'即使会后声明的其他部分select 'u_name as user_name' ? 回答1 SQL从右到左向后评估。 因此,where子句将在select子句之前进行解析和评估。 因此,尚未发生u_name到user_name的别名。 回答2 关于什么: SELECT u_name AS user_name FROM users HAVING user_name = "john"; 回答3 参见下面的MySQL手册页:http://dev.mysql.com/doc/refman/5.0/en/select.html “可以使用AS alias_name为select_expr赋予别名。该别名用作表达式的列名,并且可以在GROUP BY,ORDER BY或HAVING子句中使用。” (...) 不允许在WHERE子句中引用列别名,因为执行WHERE子句时可能尚未确定列值。 请参见第B.5.4.4节“列别名的问题”。
  • 如何在json反序列化期间忽略未知的枚举值?(How can I ignore unknown enum values during json deserialization?)
    问题 当我的枚举与json属性中提供的字符串值不匹配时,如何使Json.net不抛出? 当我根据当前文档创建枚举时会发生这种情况,但是第三方API稍后会添加更多的枚举值。 我很高兴将特殊值标记为Unknown或使用可为空的枚举,并且不匹配的值将返回null。 回答1 您可以使用自定义JsonConverter解决此问题。 这是我使用来自StringEnumConverter类中的一些内容组合而成的。 它应该使您能够灵活地以任何方式处理事情。 运作方式如下: 如果在JSON中找到的值与枚举匹配(作为字符串或整数),则使用该值。 (如果值是整数,并且有多个可能的匹配项,则使用第一个。) 否则,如果枚举类型为可为空,则将该值设置为null。 否则,如果枚举具有一个名为“未知”的值,则将使用该值。 否则,将使用枚举的第一个值。 这是代码。 随时更改它以满足您的需求。 class TolerantEnumConverter : JsonConverter { public override bool CanConvert(Type objectType) { Type type = IsNullableType(objectType) ? Nullable.GetUnderlyingType(objectType) : objectType; return type.IsEnum; }
  • ON子句中的MySQL未知列(MySQL unknown column in ON clause)
    问题 我有以下MySQL查询: SELECT p.*, IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted, pm.MediaID, date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom', astext(pg.Geometry) AS Geometry FROM property p, propertygeometry pg JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216 LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216 LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1 WHERE p.paused = 0 AND p.PropertyGeometryID = pg.id GROUP BY p.id 我得到这个错误: #1054-'on子句'中的未知列'p.id' 据我所知,查询看起来是正确的,任何想法可能是错误的吗? 回答1 不要混合使用ANSI-89样式和ANSI-92样式的连接。 它们具有不同的优先级
  • “未知的班级在Interface Builder文件中”在运行时错误(“Unknown class <MyClass> in Interface Builder file” error at runtime)
    问题 即使Interface Builder知道了MyClass ,我在启动应用程序时也会收到错误消息。 当MyClass是库的一部分时,会发生这种情况,而如果我直接在应用程序目标中编译该类,则不会发生这种情况。 回答1 尽管在运行时显示了“ Interface Builder文件中的Unclass类MyClass。 ”错误,但此问题与Interface Builder无关,而与链接器无关,后者不链接类,因为没有代码直接使用它。 当在运行时加载.nib数据(从.xib编译)时,将使用字符串引用MyClass ,但是链接器不会分析代码功能,而只是分析代码是否存在,因此它不知道。 由于没有其他源文件引用该类,因此链接器在制作可执行文件时会对其进行优化。 因此,当Apple的代码尝试加载此类时,它找不到与之关联的代码,并打印警告。 默认情况下,Objective-C目标将默认设置-all_load -ObjC标志,该标志将保留所有符号。 但是我从C ++目标开始,却没有。 但是,我找到了解决该问题的方法,该方法使链接程序具有攻击性。 我最初使用的技巧是添加一个空的静态例程,例如: +(void)_keepAtLinkTime; 它什么也没做,但是我会打一次,例如: int main( int argc, char** argv ) { [MyClass _keepAtLinkTime]
  • Xcode 6错误:Interface Builder文件中的未知类(Xcode 6 Bug: Unknown class in Interface Builder file)
    问题 我已升级到Xcode 6 beta 4,现在我的应用程序不断崩溃,并显示以下消息: Interface Builder文件中的未知类X。 它崩溃是因为据说Xcode找不到我在Storyboard中链接的自定义类,但是它表明它们在Xcode界面中已正确链接。 我很肯定所有内容都正确链接。 我唯一的其他选择可能是删除整个情节提要文件,并从头开始,因为它可能会以某种方式损坏。 编辑:我还想补充一点,我尝试了清理,重置模拟器,弄乱构建阶段等问题。这些都不起作用。 回答1 我在输入问题时解决了这个问题。 我想我会回答我的问题,并留给其他任何在使用Xcode 6 beta 4时可能遇到此问题的人使用。 若要解决此问题,您需要在Storyboard中选择每个自定义类对象(这包括任何自定义视图,甚至包括自定义视图控制器本身)。 然后,选择那些对象,打开身份检查器,然后在“自定义类”下看到“模块”选项。 在“模块”文本框中单击,然后按Enter。 而已! 我所有自定义对象的当前模块必须在Xcode 6 beta 4中在内部进行了不正确的设置,但是在检查器中没有视觉上的指示。 请注意,如果在“模块”文本框内按Enter键无效,请尝试选择右侧的箭头并手动选择当前模块,然后清除文本框并按Enter键。 您也可以尝试在课程文本框内按Enter键(尽管这通常是为了解决其他问题)。
  • WebDriverException:未知错误:对于较旧版本的Google Chrome,无法在Python中使用Selenium找到Chrome二进制错误(WebDriverException: unknown error: cannot find Chrome binary error with Selenium in Python for older versions of Google Chrome)
    问题 出于兼容性原因,我更喜欢将Chrome版本55.0.2883.75与Chromedriver v.2.26一起使用。 我从https://www.slimjet.com/chrome/google-chrome-old-version.php和Chromedriver 2.26从https://chromedriver.storage.googleapis.com/index.html?path下载了较旧版本的chrome = 2.26 /。 我正在使用以下代码尝试设置我的Chrome二进制位置: from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.binary_location = "C:\\Program Files\\Chrome\\chrome64_55.0.2883.75\\chrome.exe" driver = webdriver.Chrome('chromedriver.exe', chrome_options = options) 但是,当我尝试启动WebDriver Python时,返回以下错误: WebDriverException: unknown error: cannot
  • 未知列数上的SQL Server 2005数据透视(SQL Server 2005 Pivot on Unknown Number of Columns)
    问题 我正在处理类似于以下内容的一组数据。 StudentName | AssignmentName | Grade --------------------------------------- StudentA | Assignment 1 | 100 StudentA | Assignment 2 | 80 StudentA | Total | 180 StudentB | Assignment 1 | 100 StudentB | Assignment 2 | 80 StudentB | Assignment 3 | 100 StudentB | Total | 280 作业的名称和数量是动态的,我需要获得与以下类似的结果。 Student | Assignment 1 | Assignment 2 | Assignment 3 | Total -------------------------------------------------------------------- Student A | 100 | 80 | null | 180 Student B | 100 | 80 | 100 | 280 现在,理想情况下,我想根据“到期日”对列进行排序,该“到期日”可以包含在每个作业中/与之相关联。 如果可能的话,总数应在末尾(可以计算出总数
  • 用已知和未知字段反序列化json(Deserialize json with known and unknown fields)
    问题 给定以下json结果:默认json结果具有一组已知字段: { "id": "7908", "name": "product name" } 但是可以使用其他字段(在本例中为_unknown_field_name_1和_unknown_field_name_2 )进行扩展,这些字段在请求结果时不知道其名称。 { "id": "7908", "name": "product name", "_unknown_field_name_1": "some value", "_unknown_field_name_2": "some value" } 我想将json结果序列化并反序列化到具有已知字段属性的类中,并将未知字段(没有属性)映射到一个属性(或多个属性),如字典,以便可以访问和修改。 public class Product { public string id { get; set; } public string name { get; set; } public Dictionary<string, string> fields { get; set; } } 我想我需要一种插入json序列化程序并自己为丢失的成员进行映射的方法(用于序列化和反序列化)。 我一直在寻找各种可能性: json.net和自定义合同解析器(无法弄清楚该如何做) datacontract序列化器
  • MySQL Update查询中“字段列表”中的未知列错误(Unknown column in 'field list' error on MySQL Update query)
    问题 尝试执行此更新查询时,我不断收到MySQL错误#1054: UPDATE MASTER_USER_PROFILE, TRAN_USER_BRANCH SET MASTER_USER_PROFILE.fellow=`y` WHERE MASTER_USER_PROFILE.USER_ID = TRAN_USER_BRANCH.USER_ID AND TRAN_USER_BRANCH.BRANCH_ID = 17 这可能是语法错误,但是我尝试使用内部联接和其他更改,但是我不断收到相同的消息: Unknown column 'y' in 'field list' 回答1 尝试对“ y”使用不同的引号,因为标识符引号是反引号(“`”)。 否则,MySQL会“认为”您指向名为“ y”的列。 另请参见MySQL 5文档 回答2 用单引号将要传递给mysql服务器的任何字符串括起来; 例如: $name = "my name" $query = " INSERT INTO mytable VALUES ( 1 , '$name') " 请注意,尽管查询是用双引号引起来的,但您必须将任何字符串都用单引号引起来。 回答3 您可以检查您选择的引号(对于值,字符串等,使用双引号/单引号,对于列名使用反引号)。 由于您只想更新表master_user_profile我建议使用嵌套查询: UPDATE
  • Angular 里 unknown 和 any 的区别
    在SAP Spartacus项目里,我们定义的一个配置对象refreshFocus 属性的类型,为unknown: 这个StackOverflow讨论对于unknown和any的区别做了比较清楚的阐述: https://stackoverflow.com/questions/51439843/unknown-vs-any unknown which is the type-safe counterpart of any. unknown 和 any 相比,多了类型安全特性。 Anything is assignable to unknown, but unknown isn’t assignable to anything but itself and any without a type assertion or a control flow based narrowing. 任何值都能赋给类型为unknown的变量,但是unknown不能赋值给任何除了unknown类型之外的其他类型的变量。 Likewise, no operations are permitted on an unknown without first asserting or narrowing to a more specific type
  • PDO :: __ construct():服务器向客户端发送了未知的字符集(255)。 请向开发商报告(PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers)
    问题 我正在尝试从Symfony 3应用程序连接到MySQL数据库。 但是,当尝试从Symfony控制台命令创建MySQL模式时,出现以下错误: PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers PHP和MySQL都在Docker容器中运行。 MySQL版本: 8.0.1 PHP版本: 7.1.3 驱动程序: pdo_mysql 字符集: UTF8 dsn: "mysql:host=mysql;dbname=database;charset=UTF8;" 有任何想法吗? 回答1 MySQL 8将默认字符集更改为utf8mb4。 但是有些客户不知道这个字符集。 因此,当服务器向客户端报告其默认字符集,而客户端不知道服务器的含义时,它将引发此错误。 另请参见https://bugs.mysql.com/bug.php?id=71606 该错误是针对MySQL Connector / C ++的,因此它的影响不仅限于PHP。 好的
  • 如何读取长度未知的输入字符串?(How can I read an input string of unknown length?)
    问题 如果我不知道单词有多长,就不能写char m[6]; , 这个单词的长度可能是十或二十个长度。 如何使用scanf从键盘获取输入? #include <stdio.h> int main(void) { char m[6]; printf("please input a string with length=5\n"); scanf("%s",&m); printf("this is the string: %s\n", m); return 0; } 请输入长度为5的字符串你好这是字符串:你好 回答1 在动态保护区域的同时输入 例如 #include <stdio.h> #include <stdlib.h> char *inputString(FILE* fp, size_t size){ //The size is extended by the input with the value of the provisional char *str; int ch; size_t len = 0; str = realloc(NULL, sizeof(*str)*size);//size is start size if(!str)return str; while(EOF!=(ch=fgetc(fp)) && ch != '\n'){ str[len++]=ch; if