如何在没有strlen()、sizeof(arr)/sizeof(arr[0])的情况下获取此数组的长度;不工作,C语言
该程序将用户输入字符串标记化,删除额外的空格,并将每个单词保存到2D数组中,然后打印标记 示例: 输入:如何在没有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
“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] ) ;
}