【问题标题】:How can i use the For or while loop to fill an array of strings? [closed]如何使用 For 或 while 循环来填充字符串数组? [关闭]
【发布时间】:2020-09-29 21:34:57
【问题描述】:

当我尝试此代码时,我没有收到任何错误或警告或任何东西,它只是无法正常运行,我无法弄清楚为什么,它显示字符串混淆或缺少字符。

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

int main() {
  char arrr[53];
  int i,
  j;
  for (i = 0; i <= 5; i++) {
    printf("please enter a string \n");
    scanf("%s", &arrr[i]);
  }

  for (j = 0; j <= 5; j++)
  printf("%s \n", &arrr[j]);

  return 0;
}

【问题讨论】:

  • 您有 one 数组,并且您正在从 second 字符槽开始读取该数组,然后从第一个、第二个、第三个、第四个、第五个、第六个字符……请解释预期的行为
  • 如果输入的字符少于 53 个,则此程序的行为与预期完全相同。也就是说,它确实运行正常。也许它的作用与你认为它应该做的事情之间存在脱节。
  • 仅仅因为某些东西可以编译并不意味着代码会做你想做的事,或者它不会立即崩溃或表现不佳。例如,&amp;arrr[1] 是有效的 C 代码并且可以编译,但它仅表示“从arr 的第二个字节开始的缓冲区”,因此您每次都写入该缓冲区中完全相同的位置。
  • 您想要一个数组数组或一个指针数组。注意第一个循环中&amp;arrr[1] 的实例。这会将所有字符串读取到同一个位置,每个字符串都会破坏先前读取的字符串,跳过数组的第一个字符。这没有意义。
  • 这里的意图是读取和存储从标准输入中获取的 5 个任意长度的 C 字符串吗?

标签: arrays c for-loop


【解决方案1】:

我怀疑您正在尝试执行以下操作:

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

int
main(void)
{
        char arrr[6][53];
        int i;
        for( i = 0; i < 6; i++) {
                if( scanf("%52s", arrr[i]) != 1 ) {
                        break;
                }
        }
        for( int j=0 ; j < i; j++ ) {
                printf("%d: %s\n", j, arrr[j]);
        }

        return 0;
}

【讨论】:

  • 我能问一下你为什么使用 if 语句吗?以及它的实用性,因为它解决了问题以及为什么使用 %52s 而不是 %s ?非常感谢你:D
  • %52s 确保 scanf 不会将超过 53 个字符写入缓冲区,这很重要,因为缓冲区只能容纳 53 个字符。如果您只使用%s,您将面临缓冲区溢出的风险。您需要if 语句,以便在scanf 未读取字符串时循环中断(例如,如果到达输入末尾,或者存在读取错误)。
猜你喜欢
  • 2020-03-12
  • 2019-05-27
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2013-03-05
相关资源
最近更新 更多