c - scanf 不给第二个变量赋值
问题描述
我一直在尝试从 C 中的用户那里读取一些输入,但它似乎并没有像我希望的那样工作。我尝试读取一个字符串,直到用户写入一个冒号,然后将冒号 (':') 分配给不同的变量。除非冒号是第一个字符,否则它工作得很好。在这种情况下,它只需将值 -52 分配给两个变量,并在下一个 scanf 中读取冒号。我尝试这样做,以便将冒号分配给第二个变量,即使它是第一个变量。我试过在网上寻找,但找不到任何解决方案......任何提示都会非常受欢迎,谢谢!
我的尝试:
char ch, name[200];
scanf("%[^:]%c", &name, &ch);
printf("%s\n%c\n", name, ch);
对于有效输入,例如:
Nadav Freedman: rest_of_input
它工作并分配"Nadav Freedman"
给name
和':'
ch
但对于无效输入,例如:
: rest_of_input
尽管我想将冒号保存到ch
.
解决方案
scanf
一旦提供的任何说明符与输入不匹配,就会立即停止读取,因此在您的情况下,如果%[^:]
失败,函数将停止读取并且说明%c
符不会被处理。
因此,要强制它读取冒号,请使用 2scanf
而不是 1:
char ch, name[200];
if(scanf(" %199[^:]", name) != 1) name[0] = '\0';
scanf("%c", &ch);
printf("%s\n%c\n", name, ch);
OBS:我还添加了前导空格来消除前导空白字符。并将其限制为最多读取 199 个字符,以免超过数组的大小name
。如果第一个读取任何内容失败,还更改它以更新数组name
以存储空字符串。scanf
推荐阅读
- javascript - 如何在父div中获取元素
- java - The origin server did not find a current representation for the target resource or is not willing to disclose that one exists error
- android - Configuring source map for React Native
- android - Flutter:在外部存储路径上创建目录 - 路径提供程序 getExternalStorageDirectory()
- mobx - How to get the name of the method (@action)?
- java - 为什么 GetMethodID() 在不存在的方法上不返回 NULL?
- multithreading - PyTorch 方法中使用了哪些类型的优化?
- google-colaboratory - Mount Google drive with Pydrive
- ruby-on-rails - belongs_to reject if condition not meets in Rails 5 ActiveRecord Conditional Associations
- d3.js - 使用鼠标事件定位 this->sibling