Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有strlen()、sizeof(arr)/sizeof(arr[0])的情况下获取此数组的长度;不工作,C语言_C_Arrays_Multidimensional Array - Fatal编程技术网

如何在没有strlen()、sizeof(arr)/sizeof(arr[0])的情况下获取此数组的长度;不工作,C语言

如何在没有strlen()、sizeof(arr)/sizeof(arr[0])的情况下获取此数组的长度;不工作,C语言,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,该程序将用户输入字符串标记化,删除额外的空格,并将每个单词保存到2D数组中,然后打印标记 示例: 输入:“Hello world string house and car” 输出和预期输出: token[0]:您好 令牌[1]:世界 令牌[2]:字符串 令牌[3]:房屋 令牌[4]:和 令牌[5]:汽车 问题: 问题是,在打印令牌(代码位于最底部)时,我通过使用strlen()函数实现了这一点,我不应该使用stdio.h和stdlib.h,因为strlen()函数是在字符串中定义的。我尝试使用s

该程序将用户输入字符串标记化,删除额外的空格,并将每个单词保存到2D数组中,然后打印标记

示例:

输入:
“Hello world string house and car”

输出和预期输出:

token[0]:您好
令牌[1]:世界
令牌[2]:字符串
令牌[3]:房屋
令牌[4]:和
令牌[5]:汽车

问题:

问题是,在打印令牌(代码位于最底部)时,我通过使用
strlen()
函数实现了这一点,我不应该使用
stdio.h
stdlib.h
,因为
strlen()
函数是在字符串中定义的。我尝试使用
sizeof(arr)/sizeof(arr[0])但它不能按我所希望的那样工作,使用sizeof的结果是:

token[0]:您好
令牌[1]:世界
令牌[2]:字符串
令牌[3]:房屋
令牌[4]:和
令牌[5]:汽车
�奥肯[6]:��
令牌[7]:�
令牌[8]:����
令牌[9]:�
令牌[10]:

我希望在不使用STRLEN()的情况下获得预期的输出。

#包括
#包括
#定义真1
char标记化(char*str,char数组[10][20])
{
int n=0,i,j=0;
for(i=0;TRUE;i++)//无限循环直到字符串“\0”的结尾
{
如果(str[i]!=''){
//位置1,字符1
数组[n][j++]=str[i];//如果不是空格,则保存字符
}
否则{
数组[n][j++]='\0';//第一个单词的结尾
n++;//下一个新词的位置
j=0;//开始在位置0处写入字符
}
如果(str[i]='\0')
打破
}
返回0;
}
//删除额外的空格
char*find\u word\u start(char*str){
/*还将删除所有额外的空格*/
char*result=(char*)malloc(sizeof(char)*1000);
int c=0,d=0;
//开始时没有空间
而(str[c]=''){
C++;
}
while(str[c]!='\0'){//
结果[d++]=str[c++];//使用非空格字符
如果(str[c]=''){//在单词之间留出一个空格
结果[d++]=str[c++];
} 
而(str[c]=''{//
C++;
} 
}
结果[d-1]=“0”;
//打印还是返回字符?
返回结果;
自由(结果);
}
int main()
{
char str[]=“你好,世界弦乐花花公子和杜达斯”;
//单词和每个单词中的字符
char-arr[10][20];
//调用方法来标记字符串
标记化(查找单词、开始(str)、arr);
int row=sizeof(arr)/sizeof(arr[0]);
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/

例如(int i=0;i您使用
strlen()
的代码可能会出现在本例中,但它是不正确的


strlen(arr)
没有语义意义,因为
arr
不是字符串。在本例中,由于
arr
arr[0]具有相同的地址,因此返回5
,然后您通过使用测试
i将其应用于6字输出,显示的代码生成哪个输出?您可能应该为两个结果提供代码。不必发布所有代码,只需发布输出循环和所用变量/数组的声明。您使用
strlen()显示的代码
无效,因为
arr
不是一个字符串,而是一个字符串数组。根本不清楚该代码如何生成所示的两个结果。
row
未使用,我怀疑此代码与output.strlen和
sizeof(arr)/sizeof(arr[0]都不相关
做完全不同的事情。你应该了解它们。当你了解strlen做什么时,你就可以轻松实现自己版本的strlen并满足要求!@clifford它就在开头,就在“示例”之后:这是使用
strlen()的输出
这也是预期的输出,但我不能使用strlen(),我需要另一个选项。好的-我知道你想做什么-这很混乱,因为你问的是
strlen()
,在fat中,你想知道复制到
arr
的字符串数量。你的两个实现都不起作用-你的
strlen()
解决方案似乎很幸运。将“Hello”替换为“再见”,然后看着它失败!实际上,您不需要数组的长度或
strlen()
在这种情况下。这是一个X-Y问题-因此产生了混乱。你问的是你的解决方案,而不是你的问题。@BerndElkemann:但事实证明他实际上两者都不想要-他真正需要的是
tokenize()
提取的令牌数量。一件简单的事情可能会被一个
#include<stdio.h>
#include <stdlib.h>
#define TRUE 1
char tokenize(char *str, char array[10][20])
{
    int n = 0, i, j = 0;

    for(i = 0; TRUE; i++)//infinite loop until is the end of the string '\0'
    {
        if(str[i] != ' '){
        //position 1, char 1
            array[n][j++] = str[i];// if, it is not space, we save the character
        }
        else{
            array[n][j++] = '\0';//end of the first word
            n++;// position for next new word
            j=0;// start writting char at position 0
        }
        if(str[i] == '\0')
            break;
    }
    return 0;

}
//removes extra spaces
char* find_word_start(char* str){
    /*also removes all extra spaces*/
    char *result = (char*) malloc(sizeof(char) *1000);

    int c = 0, d = 0;

    // no space at beginning
    while(str[c] ==' ') { 
        c++; 
    }
    while(str[c] != '\0'){  // till end of sentence
        result[d++] = str[c++]; //take non-space characters

        if(str[c]==' ') { // take one space between words
            result[d++] = str[c++]; 
        } 
        while(str[c]==' ') { // 
            c++; 
        } 
    }
    result[d-1] = '\0';

    //print or return char?
    return result;
    free(result);

}
int main()
{
    char str[]="  Hello     world   string dudes and dudas  ";
    //words, and chars in each word
    char arr[10][20];

    //call the method to tokenize the string
    tokenize(find_word_start(str),arr);
    int row = sizeof(arr) / sizeof(arr[0]);

/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
for(int i = 0;i <= strlen(arr);i++)
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/

    printf("token[%d]: %s\n", i, arr[i]);

return 0;
}
int tokenize( char* str, char array[][20] )
{
    ...

    return n ;
}
int rows = tokenize( find_word_start(str), arr ) ;

for( int i = 0; i < rows; i++ )
{
    printf( "token[%d]: %s\n", i, arr[i] ) ;
}