如何在C上的1行中拆分字符串(字符)和变量?

如何在1行中拆分字符和变量?

INPUT

car1900food2900ram800 

OUTPUT

 car 1900 food 2900 ram 800 

 char namax[25]; int hargax; scanf ("%s%s",&namax,&hargax); printf ("%s %s",namax,hargax); 

如果我使用这样的代码,我需要双输入或空格来输出。 没有那个我怎么能分开?

您应该能够使用这样的代码来读取一个名称和数字:

 if (scanf("%24[a-zA-Z]%d", namax, &hargax) == 2) …got name and number OK… else …some sort of problem to be reported and handled… 

您需要将其包装在某种循环中以获得三对值。 请注意,使用&namax作为scanf()的参数在技术上是错误的。 %s%c%[…] (扫描集)符号都需要char *参数,但是你传递的是一个char (*)[25] ,这是完全不同的。 一个偶然的巧合意味着你通常会逃避虐待,但它仍然是不正确的,并且省略&很容易(和正确)。

您可以在scanf()的POSIX规范中找到有关扫描集等的详细信息。

您应该考虑使用fgets()或POSIX getline()读取整行输入,然后使用sscanf()处理生成的字符串。 这使错误报告和错误恢复更容易。 另请参见如何在循环中使用sscanf()

既然你问的这个问题实际上很简单,我认为你是C编程的初学者。 所以不要试图在输入过程中分割输入本身,对于那些不熟悉C编程的人来说这似乎有点过于复杂,我建议更简单一些(考虑到内存时效率不高)。

只需将整个输入作为String接受即可。 然后在内部检查字符串以检查数字和字母。 我已经使用它们的ASCII值来检查。 如果您找到一个字母后跟一个数字,则打印出从最后一个这样的事件到当前点的字符串部分。 虽然打印时只需稍微调整一下提取的子部分,即不用检查数字后跟字母,检查字母后跟数字,然后根据需要打印多个空格。

只是让你知道:

数字的ASCII值(0-9)=> 48到57

大写字母的ASCII值(AZ)=> 65到90
小写字母的ASCII值(az)=> 97到122

这是代码:

 #include #include int main() { char s[100]; int i, len, j, k = 0, x; printf("\nenter the string:"); scanf("%s",s); len = strlen(s); for(i = 0; i < len; i++){ if(((int)s[i]>=48)&&((int)s[i]<=57)) { if((((int)s[i+1]>=65)&&((int)s[i+1]<=90))||(((int)s[i+1]>=97)&&((int)s[i+1]<=122))||(i==len-1)) { for(j = k; j < i+1; j++) { if(((int)s[j]>=48)&&((int)s[j]<=57)) { if((((int)s[j-1]>=65)&&((int)s[j-1]<=90))||(((int)s[j-1]>=97)&&((int)s[j-1]<=122))) { printf("\t"); } } printf("%c",s[j]); } printf("\n"); k = i + 1; } } } return(0); } 

输出:

输入字符串:car1900food2900ram800

汽车1900

食物2900

公羊800

除了使用字符类来包含要作为字符串读取的字符之外,您还可以使用字符类排除允许您在字符串中向前扫描直到找到下一个数字的数字,将所有字符作为您的名字然后将数字作为整数读取。 然后,您可以使用"%n"格式说明符确定到目前为止消耗的字符数,并使用生成的字符数来抵消行中的下一个读取,例如

  char namax[MAXNM], *p = buf; int hargax, off = 0; while (sscanf (p, "%24[^0-9]%d%n", namax, &hargax, &off) == 2) { printf ("%-24s %d\n", namax, hargax); p += off; } 

注意sscanf格式字符串如何读取最多24个不是数字的字符作为namax ,然后是随后的整数,作为hargax存储off中消耗的字符数,然后将其应用于指针p以在缓冲区内前进以准备你用sscanf下一次解析。

简而言之,您可以这样做:

 #include  #define MAXNM 25 #define MAXC 1024 int main (void) { char buf[MAXC] = ""; while (fgets (buf, MAXC, stdin)) { char namax[MAXNM], *p = buf; int hargax, off = 0; while (sscanf (p, "%24[^0-9]%d%n", namax, &hargax, &off) == 2) { printf ("%-24s %d\n", namax, hargax); p += off; } } } 

示例使用/输出

 $ echo "car1900food2900ram800" | ./bin/fgetssscanf car 1900 food 2900 ram 800