为何用sscanf提取编码字符串首数字后,原字符串未移除该数字?
为什么你的sscanf代码没法移除字符串的第一个元素?
嘿,问题出在你对sscanf的工作方式理解有点偏差——sscanf只是从字符串里解析数据到变量,它根本不会修改原字符串的内容!你用sscanf把第一个数字读到x里之后,argumentos还是原来的完整字符串,所以后面print(argumentos)自然会输出全部内容。
那怎么才能实现“读取第一个元素后移除它,输出剩余内容”呢?这里给你两种实用的解决办法:
方法1:用strtok分割字符串
strtok可以帮你把字符串按指定分隔符分割成多个部分,它会修改原字符串(把分隔符替换成\0),这样就能轻松拿到第一个元素和剩余内容:
#include <stdio.h> #include <string.h> int main() { // 注意:这里要用字符数组,不能用字符串常量(char*),因为strtok会修改原字符串 char argumentos[] = "1 234 abc56"; int x; // 先分割出第一个数字部分(用空格做分隔符) char *token = strtok(argumentos, " "); if (token != NULL) { // 把分割出的字符串转成整数 sscanf(token, "%d", &x); printf("%d\n", x); // 拿到剩余的所有内容(空字符串作为分隔符表示取到末尾) token = strtok(NULL, ""); if (token != NULL) { printf("%s\n", token); } } return 0; }
方法2:用%n记录读取长度,手动偏移指针
sscanf的%n格式符可以记录它一共读取了多少个字符,我们可以用这个数字来定位剩余字符串的起始位置:
#include <stdio.h> int main() { char argumentos[] = "12 345 def678"; int x; int chars_read; // %n会把读取的字符数存入chars_read sscanf(argumentos, "%d%n", &x, &chars_read); printf("%d\n", x); // 用原字符串指针加上读取的字符数,直接指向剩余内容的开头 printf("%s\n", argumentos + chars_read); return 0; }
如果你的字符串开头可能有空格,可以把格式串改成"%d %n",这样会自动跳过数字后面的空格,让剩余内容从有效字符开始。
注意事项
如果你的argumentos是字符串常量(比如char *argumentos = "123 abc";),那不能直接用strtok修改它——因为字符串常量是只读的。这时候你需要先把它复制到一个可写的字符数组里再操作,比如用strcpy。
内容的提问来源于stack exchange,提问作者joao augusto
相关产品推荐
相关产品推荐

