我对二维数组和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个字符串,比我想象的少了一个。你能告诉我我的想法错在哪里吗?
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
字符串。这不会覆盖或更改已输入的字符串。