一串代码连接多个字符串

问题描述 投票:0回答:1

我对二维数组和for循环有一些疑问。

/* link many strings*/
#include<stdio.h>
char *mystrcat(char * strDest,  char * strSrc);

int main(void)
{
    int n;
    while(scanf("%d",&n))
    {
        if(n==0) break;
        else
        {
            char words[n][100];
            int i=0;
            int j;
            for(i=0;i<=n;i++)
            {
                while(fgets(words[i],100,stdin)!=NULL)
                {
                    j=0;
                    while(words[i][j]!='\n')
                           j++;
                    if(words[i][j]=='\n') words[i][j]='\0';break;
                }
            }
            for(i=n;i>0;i--)
            {
                 mystrcat(words[i-1],words[i]);
            }
            fputs(words[0],stdout);
        }
    }
    return 0;
}
//strcat
char *mystrcat(char * strDest,char * strSrc)
{
  char *res=strDest;
  while(*strDest)strDest++;
  while(*strDest=*strSrc)
  {
    strDest++;
    strSrc++;
  }
  return res;
}

这是一串连接多个字符串的正确代码。但我认为n在两个for循环中应该是n-1。但如果把n改成n-1的话,就只能输入n-1个字符串,比我想象的少了一个。你能告诉我我的想法错在哪里吗?

c
1个回答
1
投票
for(i=0;i<=n;i++)

i=n
时访问数组索引超出范围 - 这是未定义的行为。因此,索引当然应该从
n-1
0
(最大)或
0
n-1

C 中的数组索引也是从

0
开始的。因此,您正在访问的是
n
元素,而不是
n-1

所以更正是

for(i=0;i<=n-1;i++)

问题是 - 您正在读取数组上索引为

n
0
n-1
位置,然后将它们一一连接起来,最后所有连接的字符串都将位于
words[0]
中。您正在打印它。

第二个循环就像

        for(i=n-1;i>0;i--)
        {
             mystrcat(words[i-1],words[i]);
        }

这个想法是无论如何在访问数组索引时都不要访问出界的数组索引。这里可以简单的这样写,如第二种情况所示。问题是我们已经确保使用的所有索引都来自

{0,1,2,3...,n-1}

首先确定你想要做什么,如果你想获取

n
字符串,然后尝试连接它们,那么可以。这就是这里正在做的事情。但更简洁的方法是保留一个不同的
result
字符串,您将在其上连接
n
字符串。这不会覆盖或更改已输入的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.