将字符串拆分为C中的字符串数组

Posted

技术标签:

【中文标题】将字符串拆分为C中的字符串数组【英文标题】:Split string in to array of string in C 【发布时间】:2022-01-18 12:01:33 【问题描述】:

我尝试将字符数组转换为字符串数组。表示单个字符串到多个句子

char str[1000]="This is first. Second sentence is possible. I'm third. The fourth one is here!";

上面的字符串应该转换成句子数组。

char **sentences=
 "This is first.",
 "Second sentence is possible.",
 "I'm third.",
 "The fourth one is here!"
 ;

我尝试了下面的代码。

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

int
char_comp (char a, char b)

  return a == b;


int
is_special (char str)

  return char_comp (str, '?') || char_comp (str, '.') || char_comp (str, '!');


void
str_to_arr (char a[], char **b)

  int i = 0, j = 0, length = strlen (a), sentance_length =6, k = 0; //here added sentance_length 8 as static
  for (i = 0; i < sentance_length; i++)
    
      b[i] = (char *) malloc (length * sizeof (char));
      int n = 0;
      for (j = k; j < length; j++)
    
      b[i][n] = a[j];

      n++;
      k++;
      if (is_special (a[j]))    //if !,?,. found then move to next sentence.
        
          b[i][n] = '\0';
          break;
        

    
    


int
main ()

  char finalstr[1000]; 
    fgets(finalstr, 1000, stdin);
  char **arr = (char **) malloc ((6) * sizeof (char));
  str_to_arr (finalstr, arr);

  for (int i = 0; i < strlen (finalstr); i++)
    
      printf ("%i--->%s\n",i, arr[i]);
    
  return 0;

当我运行代码时。

输入:

Die schnelle Fourier-Transformation ist ein Algorithmus zur effizienten Berechnung der diskreten Fourier-Transformation.Mit ihr kann ein zeitdiskretes Signal in se ine Frequenzanteile zerlegt und dadurch analysiert werden.  Analog gibt es fuer die diskrete inverse Fourier-Transformation die inverse schnelle Fourier-Transformati on (IFFT). Es kommen bei der IFFT die gleichen Algorithmen, aber mit konjugierten Koeffizienten zur Anwendung. Die FFT gehoert zu den "Divide-and-conquer"-Verfahre n, sodass zuvor berechnete Zwischenergebnisse wiederverwendet werden koennen. Dadu rch koennen arithmetische Rechenoperationen eingespart werden.

输出:

0--->��V
1--->Mit ihr kann ein zeitdiskretes Signal in se ine Frequenzanteile zerlegt und dadurch analysiert werden.
2--->  Analog gibt es fuer die diskrete inverse Fourier-Transformation die inverse schnelle Fourier-Transformati on (IFFT).
3---> Es kommen bei der IFFT die gleichen Algorithmen, aber mit konjugierten Koeffizienten zur Anwendung.
4---> Die FFT gehoert zu den "Divide-and-conquer"-Verfahre n, sodass zuvor berechnete Zwischenergebnisse wiederverwendet werden koennen.
5---> Dadu rch koennen arithmetische Rechenoperationen eingespart werden.

输入:

This is first. Second sentence is possible. I'm third. The fourth one is here!

输出:

0--->This is first.
1---> Second sentence is possible.
2---> I'm third.
3---> The fourth one is here!

当句子超过 5 个时。第一句变成 ��V 像这样。我在这里做错了什么。

注意:我在这里没有使用string.h。除了 strlen。

【问题讨论】:

“我这里没有使用 string.h”:你应该这样做。 int char_comp (char a, char b) return a == b; 为什么要这样做? char **sentences 不。数组不是指针。指针不是数组。 我不确定这是否只是问题,但肯定是个问题:malloc ((6) * sizeof (char)) 中的大小计算使用了无效类型。 @SarathKumar 如果您不允许使用 string.h 中的函数,您需要在问题中明确说明。 "注意:我没有使用 string.h" 就是这个意思,不多也不少。 【参考方案1】:
char **arr = (char **) malloc ((6) * sizeof (char));

如果您尝试为 6 个句子分配空间,那是错误的。您需要为arr 的元素类型分配空间,它们是char*,而不是char

char **arr = malloc (sizeof *arr * 6);

这只会为 6 个指向字符串的指针分配空间。您现在需要为每个句子分配空间。比如:

arr[i] = malloc(sizeof *arr * (size_of_sentece + 1))

您还想为每个新句子重新分配,以不具有 6 个句子的上限。

代码中可能还有其他错误,我没有检查。

最后使用标准库并使用strtok".!?" 作为分隔符。我知道你不能为此任务评分,但是学习使用标准库是件好事。

【讨论】:

在哪里可以获得有关 malloc、realloc 字符串数组的更多信息。我在网上试了找不到合适的。 @SarathKumar ***.com/questions/562303/…

以上是关于将字符串拆分为C中的字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

C ++函数将字符串拆分为单词

C - 将字符串拆分为字符串数组

如何将字符串拆分为javascript数组? [复制]

如何首先“将字符串拆分为数组”然后“向该数组添加内容”? || C# 控制台应用程序

如何将包含字符“\ n”的多行字符串拆分为bash中的字符串数组? [复制]

C#将具有随机空格的字符串拆分为字符串数组[关闭]