我有一个字符串要读取,它是AaaaBbbb,我希望将其分配到两个单独的字符串AaaaBbbb中. 事实上,我必须读取一个没有空格的SurnameName,并将其放在两个单独的字符串中.

我的目标是分离姓氏以便进一步处理. 我不必判断意外情况,也没有其他要判断的内容,只需要判断一份SurnameName列表.

我不能用一种"简单"的方式做到这一点.

我最好的try 是

char str1[20], str2[20], str3[20]; 
fscanf(hl_inp, "%1c%[^A-Z]%s", str1, str2, str3);

但我想避免任何重新组装的过程,这里有str1str2.

有没有直接这样做的 idea ,或者比我的try 更好的 idea ?

编辑:完成重印,让我们最后一次try .

我有一根绳子.它都是小写字符,包含两个且只有两个大写字符.该字符串最多可包含20个字符.

两个大写字符遵循以下规则:

  • 它们不是连续的.
  • 他们都不可能是最后一个角色.
  • 他们中的一个总是第一个角色.

这是最好的try :

char name[] = "WillisBruce";
    char str1[20], str2[20], str3[20];
    sscanf(name, "%1s%[^A-Z]%s", str1, str2, str3);

    strcat(str1, str2);

    printf("Name: %s, Surname: %s", str3, str1);

在本例中,该字符串为"WillisBruce". 但也可能是"CareyMariah"、"JonhElton"和"ObamaBarak".

根据规定,它可能不是"麦当劳".

我不必判断规则,我可以理所当然地接受它们.

我的例子完成了我想要的工作,但我想知道我是否可以避免任何形式的重新组装.

推荐答案

Transferring a 100 into an answer

使用以下选项如何:

fscanf(hl_inp, "%1c%[^A-Z]%s", &str1[0], &str1[1], str3);

这将使用您的第一个格式字符串.它将单个字符放在str1[0]中,将名字的其余部分放在str1[1]中,因此不需要重新组装.

您还应该防止缓冲区溢出(另请参阅How to prevent scanf() causing a buffer overflow in C?):

fscanf(hl_inp, "%1c%18[^A-Z]%s", &str1[0], &str1[1], str3);

你会遇到像"麦当劳"这样的名字的问题.然而,这些迂回的问题可能超出了演习的范围.

C++相关问答推荐

有什么方法可以检测SunOS上的SparcWorks吗?

在C语言中使用scanf()时我无法理解的警告

由Go调用E.C.引起的内存快速增长

我编译了一个新的c程序,并收到以下错误

如何在C宏中确定 struct 中元素的类型?

如何跨平台处理UTF-16字符串?

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

为什么net/if.h在ifaddrs.h之前?

在C语言中,在数学运算过程中,为什么浮点数在变量中的行为不同

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

try 查找带有指针的数组的最小值和最大值

为什么会出现此错误?二进制表达式的操作数无效

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

如何使用 VLA 语法使用 const 指针声明函数

是什么阻止编译器优化手写的 memcmp()?

Clang 是否为内联汇编生成了错误的代码?