cam*_*ase 2 c whitespace scanf
我有一个字符串,如"4 Tom Tim 6",我试图用sscanf扫描这些值,如sscanf(字符串,"%d%s%d",&NUMBER1,NAME和number2)
有没有办法做到这一点,并在NUMBER1中存储值4,在NUMBER2中存储值6,在NAME中存储值"Tom Tim"?
我试过但sscanf拆分"Tom"和"Tim",因为它们之间有一个空格,因此它也为NUMBER2返回了一个不正确的值.
让我更具体一点.在我的字符串的开头和结尾总会有一个数字,以及这些数字之间的子字符串,它可以有任意长度和任意数量的空格,而我想要获得的是单个变量中的子字符串,以及开始和结束时的数字.
你把它读成了
sscanf(string, "%d %s %s %d", &NUMBER1, &NAME, &SECONDNAME, &NUMBER2);
Run Code Online (Sandbox Code Playgroud)
然后将它们连接起来
strcat(NAME," "); // Add space
strcat(NAME,SECONDNAME); // Add second name
Run Code Online (Sandbox Code Playgroud)
确保NAME有足够的空间来容纳第一个和第二个名称.你还必须:
#include <string.h>
Run Code Online (Sandbox Code Playgroud)
为了提出解决方案(并判断是否可以使用sscanf),您需要提供有关字符串格式的更多信息。到目前为止,从您提供的单个示例中无法得出任何结论性的结论。
在您的特定情况下,需要知道名称的结尾和下一个数字的开头。你如何定义你的情况?我们是否应该假设第一个十进制数字字符表示名称的结尾和开头number2?或者是更复杂的事情?如果输入字符串包含一个"Tom16"序列,整个"Tom16"应该是名称,还是应该将其拆分"Tom"并保留16为number2?
基本上,如上所述,您的问题没有有意义的答案,只能提供随机建议。
更新:您对字符串格式的描述还远未完成,但我建议在sscanf
sscanf(string, "%d %[^0123456789]%d", &number1, name, &number2)
Run Code Online (Sandbox Code Playgroud)
这将起作用,假设您所指的“数字”仅由十进制数字组成,并且假设该名称不能包含任何十进制数字。另请注意,它不会在名称中包含前导空格,但会包含尾随空格。如果您不想要它,则必须自己修剪名称中的尾随空格。
无论如何, 的解析能力sscanf是相当有限的。它们通常不足以解决像您这样的问题。我上面的内容可能是你能从中得到的最好的东西sscanf。如果您需要更复杂的内容,则必须逐个标记地手动解析字符串,而不是尝试使用sscanf.