因此,我在做一个小项目,而我想要获取模拟数据,并将它们分离成结构。但我在想有多个名字和/或姓的人的问题。
我想像你那样写名字(比如"Michael")和所有大写字母的姓氏(比如"JAMESON")。
但是,如果我读到一个像,Michael,Daniel,VAN,DOORNE,,等等的名字,我不知道我怎么能把"Michael Daniel“作为名字,把"VAN DOORNE”作为姓。我试着用第一个大写字母来分开,但我当然也把第一个字母大写在别人的名字里。
示例:
我想读Michael Daniel VAN DOORNE,把它分成"Michael Daniel“作为名字,"VAN DOORNE”作为姓氏。
sscanf(buffer, "%s %s", firstName, lastName);那是不正常的。但我还是想出了一个解决方案,用多个名字和姓氏来模拟名字。
发布于 2018-11-29 14:22:51
由于您似乎完全控制了数据,所以我建议采用另一种方法:
在名字和姓氏之间的一个特殊分隔符。然后,您不再依赖大小写敏感,特别是出现在另一个答案中的单个字符名称问题不再是一个问题了。
分隔符字符应该是不会出现在任何名称中的字符,如制表符(与空格相反)、#、“\”、.即使是逗号或分号也应该很好,尽管句点可能出现在缩写的名称中,因此不应该使用。
发布于 2018-11-29 14:15:27
因此,知道它是名字或姓氏的一部分有点困难,但是从它的声音来看,你可以控制数据,所以你可以用小写的名字和大写的最后一个名字,或者使用其他的方法。
拆分字符串,这相对容易使用strtok。
假设您正在逐行读取名称,并将它们填充到buffer中。
使用strtok将buffer分解为“名称”。
char *token
token = strtok(buffer, " "); //note the second parameter is what you want to parse the array by
while(token != NULL)
{
if(isupper(token[0]))
//store that token into your struct (first or last name) allow for multiple
else
//store into the other
token = strtok(NULL, " "); //keep looping on string for names
}发布于 2018-11-29 14:15:00
假设姓总是用大写写的,那么从末尾开始读取字符串,看看什么时候有最后一个小写。
int i=strlen(buffer)-1;
while(!islower(buffer[i]) && i>0)
i--;
strncpy(firstName,buffer,i+1);
strcpy(lastName,&buffer[i+2]);https://stackoverflow.com/questions/53540199
复制相似问题