我已经有一段时间没用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;
}
答案 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
后,将其余代码更改为word
至words
。
size_t word_idx = 0;
for(
char *word = strtok(function,"+");
word != NULL;
word = strtok(NULL, "+")
) {
words[word_idx++] = word;
}