我是C编程的新手。我的程序应该采用字符串并将其移动到2D数组中。用白色空格或数字分隔。如果有一个空格或数字将它分开,这种方法非常好。但是,只要有多个,它就会开始添加' \ 0'到我的阵列。
//Move the string into a 2D array
for(i = 0; i < total + 1; i++)
{
if(isalpha( *(tempString + i) ))
{
sortingArray[n][j++] = tempString[i];
input++;
}
else
{
sortingArray[n][j++] = '\0';
n++;
j = 0;
}
if(tempString[i] == '\0')
break;
}
这是发生的事件的样本(n =放置的行数)
./ a.out&#34;还有一种方式&#34;
5个输入
前
一个
更多
方式
在
一个
更多
方式
答案 0 :(得分:0)
您需要跳过连续的分隔符:
for(i = 0; i < total; i++)
{
if(isalpha(tempString[i]))
{
sortingArray[n][j] = tempString[i];
++j;
++input;
}
else
{
// skip consecutive delimiters
while (i < total && !isalpha(tempString[i]))
++i;
sortingArray[n][j] = '\0';
++j
++n;
j = 0;
}
}
免责声明:未经编译器验证。请小心!
我还冒昧地对原始代码进行了一些改进。
\0
是没有意义的。*(tempString + i)
更改为明确tempString[i]
答案 1 :(得分:0)
这是一个简单的逻辑故障,调试器非常适合识别。
想象一下,你有字符串&#34; hello world&#34;。
它存储&#34;你好&#34;很容易进入sortingArray[0]
。当它到达第一个空格时,它会递增n
并开始寻找下一个单词。但它找到的下一个字符是另一个空格,因此它再次递增n
。
您的逻辑需要稍作修改
if(isalpha( *(tempString + i) ))
{
sortingArray[n][j++] = tempString[i];
input++;
}
else if(j>0)
{
sortingArray[n][j++] = '\0';
n++;
j = 0;
}
现在代码只会增加n
如果前一个字符是一个字母(由于j
大于0)。否则,如果它不关心并继续前进。
您还应该检查循环后j
是否为非零,因为这意味着sortingArray中有一个需要添加NUL
的新条目。
还有一点需要注意的是,你进行for
循环的方式有点奇怪。你有这个
for(i = 0; i < total + 1; i++)
但这也是循环内的
if(tempString[i] == '\0')
break;
通常,终止for
循环的方法是将其写为
for(i = 0; tempString[i]!='\0'; i++)
这样你首先不关心字符串的长度,但是当它到达NUL字符时循环就会完成。