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

时间:2018-05-30 23:21:07

标签: c

我已经有一段时间没用C编写程序。我习惯用C#编写代码。

因此,我想使用分隔符将用户字符串输入拆分为字符串数组。 我这样做了,但是当我想要获取数组时,我遇到了分段错误。 举个例子,我只想打印一个数组元素。

我已经在网上查了一下,但没有任何效果。

任何提示?

由于

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

int main ()
{

  char function[] = {};
  char * pch;
  int cpt = 0;
  int nb_terms = 0;

  printf("Entrez le nombre de termes :\n");
  scanf("%d", &nb_terms);

  char word[nb_terms];

  printf("Entrez votre fonction en n'utilisant que les 5 caractères suivants (a,b,c,d et +) :\n");
  scanf("%s", &function);

  pch = strtok (function,"+");
  while (pch != NULL)
  {
    word[cpt++] = pch;
    printf ("%s\n",pch);
    pch = strtok (NULL, "+");
  }

  printf ("%s\n",&word[1]);

  return 0;

}

1 个答案:

答案 0 :(得分:2)

编译器警告显示您的问题。

cc -Wall -Wshadow -Wwrite-strings -Wextra -Wconversion -std=c99 -pedantic -g   -c -o test.o test.c
test.c:7:21: warning: use of GNU empty initializer extension [-Wgnu-empty-initializer]
  char function[] = {};
                    ^
test.c:7:21: warning: zero size arrays are an extension [-Wzero-length-array]
test.c:18:15: warning: format specifies type 'char *' but the argument has type 'char (*)[0]'
      [-Wformat]
  scanf("%s", &function);
         ~~   ^~~~~~~~~

这些都是相关的。 char function[] = {}GNU extension to declare a 0 size array。然后你试着把东西放进去,但它的大小为0.所以会有溢出。

相反,您需要为function分配一些空格,并确保将scanf限制为仅限该尺寸,不得更大。

// {0} initializes all characters to 0.
// 1024 is a good size for a static input buffer.
char function[1024] = {0};

// one less because of the null byte
scanf("%1023s", &function);

下一个警告......

test.c:23:17: warning: incompatible pointer to integer conversion assigning to 'char' from 'char *';
      dereference with * [-Wint-conversion]
    word[cpt++] = pch;
                ^ ~~~
                  *

是因为您尝试将字符串(char *pch放在字符(char)的位置。即使您只从strtok读取单个字符(您无法保证),它也会返回一个字符串。你想要一个字符串数组(char **)。它还有助于描述变量名称。

char *word;                 // this was pch
char *words[nb_terms];      // this was word

pch更改为word后,将其余代码更改为wordwords

  size_t word_idx = 0;
  for(
      char *word = strtok(function,"+");
      word != NULL;
      word = strtok(NULL, "+")
  ) {
      words[word_idx++] = word;
  }

我将添加the usual caveats about scanf