c - 从 STDIN 读取一行以仅使用 C 提取数字标记

标签 c arrays string loops numbers

问题陈述:

需要处理从 STDIN 接受的输入字符串。并仅查找字符串中存在的所有数字标记。 将标记视为由空格分隔的可打印字符序列。 (在数字标记中,所有字符都是数字)

您需要构建一个新字符串,其格式为 numeric_token1 numeric_token2 按升序打印。 (一个空格是分隔符)(如果没有找到数字标记,则需要打印 NONE FOUND)

输入:我们需要从 STDIN 读取一行以仅提取数字标记

输出:由 number1 number2 升序组成的字符串。或者没有找到

测试用例:

Input: hello hi 123  789 45 hi
Output: 45 123 789

Input: 20 abc beg 90 67
Output: 20 67 90

Input: hi hello foo bar foo
Output: NONE FOUND

我尝试了以下方式,使用静态方式,以升序对它们进行标记化和重新排列,但不够幸运。我是这些 token 的新手,非常感谢任何帮助。

#include <string.h> 
#include <ctype.h> 
#include <stdlib.h>

char* RemoveCharac(char* input) 
{ 
   char* dest = input;
   char* src = input;

   while(*src) 
   { 
      if (isalpha(*src)) 
         { 
         src++; 
         continue; 
         } 

      *dest++ = *src++; 
   } 

   *dest = '\0'; 
   return input; 
} 

int main(void) 
{ 
   char inText[] = "hello hi 123  789 45 hi"; 
   char *pch; 
   char* strArray[1024];
   char* ResText = RemoveCharac(inText);

   int i = 0,j; 
   printf("The result is %s\n", ResText); 
   pch = strtok (ResText," ,.-"); 
   while (pch != NULL) 
   { 
      strArray[i] = malloc(strlen(pch) + 1); 
      strcpy(strArray[i], pch); 
      printf ("%s ",pch); 
      pch = strtok (NULL, " ,.-"); 
      i++; 
   }

   printf ("\n"); 
   for(j=0;j<i;j++) 
   { 
      printf("\t %s",strArray[i]); 
   } 

   return 0; 
}

最佳答案

使用fgets()读取字符串,strtok()将其拆分为 token ,isdigit()检查 token 是否为数字,atoi()将字符串转换为数字,qsort()对字符串进行排序。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int main(void) {
    char input[100];
    int tokens[20], counter = 0;
    fgets(input, sizeof(input), stdin);
    input[strcspn(input, "\n")] = 0;

    char * pch = strtok (input," ");
    while (pch != NULL)
    {
        int isNumber = 1;
        //printf ("%s\n", pch);
        for (size_t i = 0; i < strlen(pch); ++i)
            if (!isdigit(pch[i]))
                isNumber = 0;
        if(isNumber)
            tokens[counter++] = atoi(pch);
        pch = strtok (NULL, " ");
    }
    qsort (tokens, counter, sizeof(int), compare);
    for(int i = 0; i < counter; ++i)
        printf("%d ", tokens[i]);
    if(!counter)
        printf("NONE FOUND");
    printf("\n");
    return 0;
}

关于c - 从 STDIN 读取一行以仅使用 C 提取数字标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46499205/

相关文章:

序列中的 PHP 数组值

java - 类型信息如何存储在内存中(如果有的话)

c - 如何在C中将随机字符放入多维数组中

java - 我的程序抛出 java.lang.ArrayIndexOutOfBoundsException

ios - Swift 数组重置自身

c++ - 为什么 C++ 中长度为 n 的字符字符串在 [n] 索引上总是有一个空字符作为垃圾?

c# - 拆分字符串模式

在 C 中从 argv 创建整数数组

不同硬币的硬币变化上限不同吗?

用于 wiki 格式字符串的 Java 库? [b] 至 <strong>,[url] 至 <a href>