gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:13 27 4
gpt4 key购买 nike

我已经有一段时间没有用 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;

}

最佳答案

编译器警告揭示了您的问题。

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;
}

我会添加 the usual caveats about scanf .

关于c - 将字符串拆分为字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50614579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com