【问题标题】:If I have an array of pointers to strings (words), how can i access each word individually?如果我有一个指向字符串(单词)的指针数组,我如何单独访问每个单词?
【发布时间】:2021-08-24 18:39:26
【问题描述】:

我正在编写一个函数,它接收一个空的指针数组,该函数最多应扫描的字数(大小)(顺便说一句,它可以扫描小于 size 的字数),以及最大长度一个词(我应该确保一个词不超过)。

这是我的代码(我使用的是 C 并且带有箭头的行会出错):

void read_words(char* words[], int size, int max_str_len)
{
    int i=0;

    while( (i<size ) && (scanf("%s", & *words[i]) != EOF ))
    {
    
1->      if(strlen(*words[i]) > max_str_len )       
        {
2->          *words[i][max_str_len-1] = '\0';         
        }
    }
}

在遇到一堆错误后,我意识到错误来自指针数组仅指向序列的第一个字符(仅表示单词的第一个字母)这一事实。

(第一行箭头也给了mr以下错误: 错误:传递 'strlen' 的参数 1 使指针从整数不进行强制转换)

所以问题是,我该如何解决?我如何得到整个单词或到达它的结尾?如果我将其更改为“ *words[i] + max_str_len ”是否可以解决问题?但在那种情况下,我可能会得到内存中另一个变量的值......

非常感谢任何帮助:)

【问题讨论】:

  • 提示:首先执行i&lt;size 然后scanf() 是有意义的。
  • *words[i].strlen() 看起来不像 C。你的意思是 strlen(words[i])
  • '/0' 当然应该是'\0'
  • 我假设max_str_len 是(大于)每个word 可以容纳的最大字符数。如果您在每个单词中写入超过该数字(scanf 会很乐意这样做),则行为将是未定义的。尝试通过在末尾写入空字符来截断字符串并不能避免问题。
  • 使用array[index] 访问数组元素,而不是*array[index],就像您在代码中的任何地方所做的那样。

标签: c string function pointers


【解决方案1】:

您不能只允许scanf 将任意长的字符串写入每个单词,否则您将通过写入max_str_len 或更多字符来溢出缓冲区。相反,您需要限制scanf 的写入量,例如:

char fmt[32];
sprintf(fmt, "%%%ds", max_str_len - 1);
while( (i < size) && (scanf(fmt, words[i]) == 1) ){
   ...

一般来说,你不应该使用没有最大字段宽度的%s 作为scanf 格式字符串中的转换说明符,因为scanf 很容易溢出它正在写入的数组的边界。如果 buf 分配了 N 个字符,则格式字符串应类似于 %Ms 其中 M == N - 1 为空终止符留出空间。在上面的示例中,我们使用sprintf 来生成所需的格式字符串。

请注意,如果输入中的任何字符串超过最大长度,这些字符串将在您的数组中多次拆分为word。您需要决定如何处理这种情况并添加适当的逻辑。

【讨论】:

  • scanf 的参数应该是 words[i],而不是 words + i。 OP 的代码还有许多其他问题。
  • @interjay 感谢您指出这一点!已编辑。
  • 感谢您的帮助,但在上述问题的同样意义上,我仍然在不同的函数中遇到相同的错误:假设函数扫描大小的单词量,我想要编写一个while循环来打印它们,代码是什么?我试过了,但这和我一开始遇到的问题一样,数组中的每个指针只指向每个单词的第一个字母,而不是整个单词...
  • 字符串就是这样工作的。如果写char buf[] = "abcedfg"; char *aptr = buf; printf("%s\n", aptr),那么aptr指向a开头的bufprintf写的是整个字符串。
  • 这就是问题所在,它没有打印,程序在到达该行的第二秒就终止了:printf("%s \n", *words[i]);
猜你喜欢
  • 2018-10-17
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多