【问题标题】:Store two integers from a String in C在 C 中存储字符串中的两个整数
【发布时间】:2025-12-24 07:10:06
【问题描述】:

我正在尝试编写一个从字符串中打印两个数字的程序。

例如,string = '20,66' 我试图将这个字符串分开,以便将 '20' 和 '66' 存储到两个单独的变量中。

这是我正在处理的代码:

#include <stdio.h>

char line[80];

int main(void)
{
    // Variables
    int start_number, end_number;
    int i, j;

    while(1)
    {
        printf("Enter a number: ");
        fgets( line, sizeof(line), stdin);

        // How to find Comma
        for( i=0; i < strlen(line); i++)
        {
            if(line[i]==',') break;
        }

        // How to find two numbers
        for(j = 0; j < i; j++)
        {
            printf("1: %c\n", line[j]);         
        }

        for(j = i + 1; j < strlen(line); j++)
        {
            printf("2: %c\n", line[j]);
        }

        if (strcmp(line, "quit\n") == 0)
        {
            printf("Now terminating program...");
            break;
        }       

    }   
}

到目前为止,我只能存储单个数字变量,并且由于某种原因打印了额外的一行。

任何建议或意见将不胜感激。

【问题讨论】:

  • 这听起来像是入门级课程的家庭作业问题......

标签: c string integer c-strings


【解决方案1】:

很简单:

const char *text = "20,30";
const char *rest = 0;
int first = strtol(text, &rest, 10); // input, pointer to remaining string, base (10 = decimal)
rest += 1; // skip the comma; this is error prone in case there are spaces!
int second = strtol(rest, NULL, 10); // not interested in remaining string, so pass NULL this time

【讨论】:

    【解决方案2】:

    查看scanf 及其亲属:

    #include <stdio.h>
    
    int main() {
      int x, y;
      sscanf("22,33", "%d,%d", &x, &y);
      printf("Scanned vars: %i %i\n", x, y);
    }
    tmp]$ ./a.out 
    Scanned vars: 22 33
    

    可能会引入安全漏洞,因此请务必阅读并理解security 上的部分,以便您有足够的存储空间来存储您尝试扫描的值。

    【讨论】:

      【解决方案3】:

      多种方法之一:找到逗号后,可以将逗号更改为(char)0。然后你会有两个字符串,一个是line,另一个是line+comma_offset+1。两者都只是数字,可以传递给atoi

      由于 C 字符串的实现方式,这个技巧有效——字符串的结尾是 0。所以,你取一个字符串:

      '1'  '2'  ','  '3'  '4'  0x00
       |
      line
      

      并将逗号替换为 null:

      '1'  '2'  0x00 '3'  '4'  0x00
       |              |
      line            str_2
      

      那么你有两个 C 字符串。这就是strtokstrtok_r 的工作原理。

      【讨论】:

        【解决方案4】:

        也许您不想在 for 循环中打印 "1:" 和/或 NEWLINE ("\n")。改变这个:

        for(j = 0; j < i; j++)
        {
            printf("1: %c\n", line[j]);
        }
        

        到这里:

        printf("1: "); 
        for(j = 0; j < i; j++)
        {
            printf("%c", line[j]);
        }
        printf("\n"); 
        

        【讨论】:

          【解决方案5】:
          #include <stdio.h>
          
          char line[80];
          
          int main(void)
          {
              // Variables
              int start_number, end_number;
              int i, j;
          
              while(1)
              {
                  printf("Enter a number: ");
                  fgets( line, sizeof(line), stdin);
                  for( i=0; i < strlen(line); i++)
                  {
                        char num[];
                      if(line[i]!=','){
                          num[j++] = line[i];  
                      }
                      else{
                          for(int x =0 x<strlen(num); x++) 
                              printf("Number :%c", num[x]);
                          j=0;
                        }
                  }
              }
          }
          

          【讨论】: