【问题标题】:How to write a getline function in C?如何在 C 中编写 getline 函数?
【发布时间】:2013-01-23 13:59:57
【问题描述】:

我知道 getline 是 C++ 标准,但我需要读取一行数字:

123856

并将其保存到数组中。但是如何在给定(作为输入)数字之间没有空格的情况下做到这一点?我希望用户输入是:

123856(没有空格),然后将其保存到一个数组(n 元素数组)中,之后,我希望我的数组看起来像这样:

array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 8;
array[4] = 5;
array[5] = 6;

但是如何在没有getline 的情况下用 C 语言制作它?

这不是我想要的:

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

int main(int argc, char **argv)
{
    int t[4];
    int i;

    for(i=0; i<4; i++)
        scanf("%d", &t[i]);
    for(i=0; i<4; i++)
        printf("%d\n", t[i]);

    return 0;
}

【问题讨论】:

  • 你从哪里读到的?一个文件?
  • 嗯...scanf("%d", digits); ?
  • @N1xx1:不,这(scanf)需要空格...
  • @yak:嗯,当然,但是你可以用一些数学魔法把它转换成数组。

标签: c getline


【解决方案1】:

如果我理解你的正确,下面应该这样做:

  1. 阅读整行
  2. 只要你得到数字或字符串结束就循环遍历字符串
  3. 对于每个数字,将其值放入数组并将索引增加 1

【讨论】:

  • 好的,你在我写的时候编辑了你的问题 :-) 如果要求不使用 getline,只要你得到数字并将它们放在一个数组中,就逐个字符地读取。
  • @WilliamPursell 为什么没有意义? Yak 的要求是读取一行数字。假设 EOL 也是他的数字行的结尾,他可以通过一次读取缓冲区而不是轮询单个数字来节省许多 CPU 周期。
  • 使用 getchar 读取单个字符只会调用一个系统调用,但它允许系统为您处理所有缓冲并且需要更少的代码。
  • Yak 的要求是将一行字符放入一个数组中。 Yak 的问题是 Yak 认为必须阅读整行。
  • 它至少仍然为每个要读取的字符调用getchar。当然,其影响取决于要读取的数据集的大小。
【解决方案2】:
while( ( c = getchar()) != EOF  &&  c != '\n' &&  i < max ) {
    /* If desired, add check for value outside of 0-9 */
    array[ i++ ] = c - '0';
    ...
}

【讨论】:

  • 在这个编辑之后,你实际上搞错了——你认为 sizeof (array) 有什么作用?太危险了……
  • @WilliamPursell 请注意,这仅适用于“堆栈上”的数组,不适用于动态分配的数组。我想这就是 Dariusz 的意思。
  • sizeof 数组返回数组的大小。如果 array 是一个指针,这确实会失败。如果数组是一个数组,它工作得很好。也许应该使用更简单的边界检查来防止任何混淆。
  • @WilliamPursell 只是为了避免混淆:数组和指针之间没有真正的区别。如果我动态分配一个数组,这已经失败了。
  • 数组和指针之间有真正的区别。指针寻址内存。数组跨越内存。给定 int *x, y[ 50 ]sizeof x == sizeof( int * )sizeof *x == sizeof( int )sizeof y == 50 * sizeof( int )。当作为参数传递时,数组衰减为指向第一个元素的指针,并且语言的语法通常允许数组名称与指向数组的指针互换使用,但它们是不同的东西。
【解决方案3】:
char arr[] = "1234567";
int intarr[10];

int count = 0;
for (char* ptr = arr; *ptr; ptr++) {
  intarr[count] = *ptr - '0';
  count++;
}

【讨论】:

  • 如果你写 ''intarr[count] = *ptr - '0';'' 而不是硬编码的 ASCII 值,也许代码变得更易读......当然它也应该是注意不要超过数组的长度...
  • @junix '0' 对。休息 - 这是一个快速简单的答案,没有必要做几个 if 来检查各种条件。让那家伙自己做一些工作
  • 是的,但谁说这家伙知道讨厌的副作用? ;-) 只是想提一下,这不是一个“插入式”解决方案,需要更多思考。
  • 抱歉,没注意到 ;-)
【解决方案4】:

试试这个

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

 main (int argc, char *argv[])
{

    FILE *f;


    int i=0;
    int j=0;
    char output[100];
    char* output1[100];
    char string[100];
    char delims1[] = " ";
    char delims2[] = "*";
    char* result = NULL;
    char* result3 = NULL;
    int num;



//for (j=0; j<2; j++)
//{
    //printf("%s",delims9[6]);
//}

f = fopen("text.txt","r");
   //
    while( fgets(string,sizeof(string),f) )
    {

        result = strtok( string, delims1 );

        while( result != NULL )
        {
            output1[i]=result;
          printf("%s\n",output1[i]);
          result = strtok( NULL, delims1 );
            i++;

        }

    for (num = 0; num < 100; i++ )      //
    {                                   // Error On this array
        printf("%s\n", output1[i]);     //
    }                                   //


    }
printf("\n%d",i/3+1);



    return 0 ;
}

【讨论】:

    【解决方案5】:

    好的,不使用任何字符串。

    int digits = 123856;
    int numofdigits = 1 + floor(log10(digits));
    
    int digits_arr[numofdigits];
    int i;
    for(i = numofdigits-1; i >= 0; i--) {
        digits_arr[i] = (int)floor(digits / pow(10, i)) % 10;
    }
    

    【讨论】:

      【解决方案6】:

      试试下面的链接...这里提出了同样的问题并获得解决方案....

      convert an integer number into an array

      char * convertNumberIntoArray(unsigned int number) {
          unsigned int length = (int)(log10((float)number)) + 1;
          char * arr = (char *) malloc(length * sizeof(char)), * curr = arr;
          do {
              *curr++ = number % 10;
              number /= 10;
          } while (number != 0);
          return arr;
      }
      

      【讨论】:

      • 您错过了重点:该数字已作为字符串存在。无需将其转换为字符串。另一件事是您所做的转换在 cpu 周期方面非常昂贵。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2020-02-04
      相关资源
      最近更新 更多