二维字符串数组存储' \ 0'当遇到一个有多个空格或数字的单词时

时间:2018-01-30 16:56:06

标签: c arrays

我是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个输入

一个

更多

方式

一个

更多

方式

2 个答案:

答案 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字符时循环就会完成。