在 C 中打印 char* 时,仅打印第一个字符
when printing a char* in C only the first character is being printed
我正在尝试编写一个函数来打印字符串的子字符串,但是在打印它时,只打印数组中的第一个字符。
正如您在代码中看到的那样,我在创建子字符串并正确显示后在函数中放置了一个 printf
语句。然而,当函数被传递到主函数中的 printf
函数时,它只打印第一个字符。
感谢人们能够提供的任何帮助。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
char *ft_substr (const char *s, unsigned int start, size_t len)
{
char *str;
unsigned int i;
unsigned int j;
str = malloc(len * sizeof(char) + 1);
i = start;
j = 0;
while (i < len + start)
{
str[j] = s[i];
j++;
i++;
}
str[j + 1] = '[=10=]';
printf("%s\n", str);
free(str);
return (str);
}
int main (void)
{
char hello[] = "Hello World";
char sub = *ft_substr(hello, 1, 4);
printf("%s\n", &sub);
return (0);
}
在从函数返回指针 str
之前,您释放了所有分配的内存
free(str);
return (str);
所以返回的指针是无效的
删除语句
free(str);
函数中的另一个问题是在此语句中使用了不正确的索引
str[j + 1] = '[=12=]';
随便写
str[j] = '[=13=]';
这个声明也是不正确的
char sub = *ft_substr(hello, 1, 4);
它声明了单个字符,而您需要声明一个指向函数中动态分配的字符串的指针。所以写
char *sub = ft_substr(hello, 1, 4);
然后写
printf("%s\n", sub);
free( sub );
如果您使用 size_t
类型作为字符串的长度,那么也使用 size_t
.
类型的索引
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
char * ft_substr( const char *s, size_t start, size_t len )
{
char *str = malloc( len + 1 );
if ( str != NULL )
{
size_t i = 0;
for ( ; i < len; i++ )
{
str[i] = s[start + i];
}
str[i] = '[=17=]';
}
return str;
}
int main(void)
{
const char *hello= "Hello World";
char *sub = ft_substr( hello, 1, 4 );
if ( sub != NULL ) puts( sub );
free( sub );
return 0;
}
它的输出是
ello
如果函数会检查起始索引和长度是否指定正确,函数会更安全。例如
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * ft_substr( const char *s, size_t start, size_t len )
{
char *str = NULL;
size_t n = strlen( s );
if ( start < n )
{
if ( n - start < len ) len = n - start;
str = malloc( len + 1 );
if ( str )
{
memcpy( str, s + start, len );
str[len] = '[=19=]';
}
}
return str;
}
int main(void)
{
const char *hello= "Hello World";
char *sub = ft_substr( hello, 1, 4 );
if ( sub != NULL ) puts( sub );
free( sub );
return 0;
}
你的主线有UB。您尝试将单个字符打印为字符串(作为参考传递)。
int main (void)
{
char hello[] = "Hello World";
char *sub = ft_substr(hello, 1, 4);
printf("%s\n", sub?sub:"");
free(sub);
return (0);
}
我正在尝试编写一个函数来打印字符串的子字符串,但是在打印它时,只打印数组中的第一个字符。
正如您在代码中看到的那样,我在创建子字符串并正确显示后在函数中放置了一个 printf
语句。然而,当函数被传递到主函数中的 printf
函数时,它只打印第一个字符。
感谢人们能够提供的任何帮助。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
char *ft_substr (const char *s, unsigned int start, size_t len)
{
char *str;
unsigned int i;
unsigned int j;
str = malloc(len * sizeof(char) + 1);
i = start;
j = 0;
while (i < len + start)
{
str[j] = s[i];
j++;
i++;
}
str[j + 1] = '[=10=]';
printf("%s\n", str);
free(str);
return (str);
}
int main (void)
{
char hello[] = "Hello World";
char sub = *ft_substr(hello, 1, 4);
printf("%s\n", &sub);
return (0);
}
在从函数返回指针 str
之前,您释放了所有分配的内存
free(str);
return (str);
所以返回的指针是无效的
删除语句
free(str);
函数中的另一个问题是在此语句中使用了不正确的索引
str[j + 1] = '[=12=]';
随便写
str[j] = '[=13=]';
这个声明也是不正确的
char sub = *ft_substr(hello, 1, 4);
它声明了单个字符,而您需要声明一个指向函数中动态分配的字符串的指针。所以写
char *sub = ft_substr(hello, 1, 4);
然后写
printf("%s\n", sub);
free( sub );
如果您使用 size_t
类型作为字符串的长度,那么也使用 size_t
.
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
char * ft_substr( const char *s, size_t start, size_t len )
{
char *str = malloc( len + 1 );
if ( str != NULL )
{
size_t i = 0;
for ( ; i < len; i++ )
{
str[i] = s[start + i];
}
str[i] = '[=17=]';
}
return str;
}
int main(void)
{
const char *hello= "Hello World";
char *sub = ft_substr( hello, 1, 4 );
if ( sub != NULL ) puts( sub );
free( sub );
return 0;
}
它的输出是
ello
如果函数会检查起始索引和长度是否指定正确,函数会更安全。例如
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * ft_substr( const char *s, size_t start, size_t len )
{
char *str = NULL;
size_t n = strlen( s );
if ( start < n )
{
if ( n - start < len ) len = n - start;
str = malloc( len + 1 );
if ( str )
{
memcpy( str, s + start, len );
str[len] = '[=19=]';
}
}
return str;
}
int main(void)
{
const char *hello= "Hello World";
char *sub = ft_substr( hello, 1, 4 );
if ( sub != NULL ) puts( sub );
free( sub );
return 0;
}
你的主线有UB。您尝试将单个字符打印为字符串(作为参考传递)。
int main (void)
{
char hello[] = "Hello World";
char *sub = ft_substr(hello, 1, 4);
printf("%s\n", sub?sub:"");
free(sub);
return (0);
}