我已经编写了一个返回一些字符的函数,我想要做的就是将所有返回的字符追加到一个字符串中。
#include <stdio.h>
#include <string.h>
char func(int n);
int main()
{
int i;
char str[] = "";
size_t p = strlen(str);
for (i =0 ; i < 5; i++){
str[p++] = func(i);
str[p] = '\0';
p++;
}
printf("%s",str);
return 0;
}
char func(int n){
if (n == 0)
return '1';
if (n == 1)
return '2';
if (n > 1)
return '3';
}
// EDIT输出为19
答案 0 :(得分:3)
char func(n){
if (n == 0)
return '1';
if (n == 1)
return '2';
if (n > 1)
return '3';
}
您应该始终指定变量的类型。
请使用int n
之类的内容,而不只是n
。
所有的回报都是有条件的,这也很糟糕,最好有一个保证执行的返回语句,无论什么*:
char func(int n) {
if (n == 0) return '1';
if (n == 1) return '2';
return '3';
}
*因为没有从应该返回值的函数返回值是未定义的行为。
现在我们已经解决了这个问题,让我们来看看你的main()
:
int main() {
int i;
char str[] = "";
size_t p = strlen(str);
for (i =0 ; i < 5; i++){
str[p++] = func(i);
str[p] = '\0';
p++;
}
printf("%s",str);
return 0;
}
str[]
不足以存储您写入的所有字符,从而导致未定义的行为。
您的循环体以奇怪的方式编写,为什么要递增p
两次?
这是一个非常简单的程序,它将5个字符写入str
:
#include <stdio.h>
char func(int n) {
if (n == 0) return '1';
if (n == 1) return '2';
return '3';
}
int main() {
int i;
// Allocate 6 bytes (5 characters) on the stack
char str[6] = "";
for (i = 0 ; i < 5; i++) {
str[i] = func(i);
}
// Strings *must* be NULL terminated in C
str[5] = 0;
printf("%s",str);
return 0;
}
答案 1 :(得分:1)
这里你的str的大小是“0”(0使用strlen,1使用sizeof运算符,因为它计算'\ 0'字符)所以你不能添加更多的元素到str,如果你尝试,程序会崩溃。所以你在这里有两个可能性,第一个是声明一个固定的表大小,数字n将受到大小的限制,第二个是使用mallic的动态数据。要将其初始化为零,您只需使用memset API。
答案 2 :(得分:1)
简短的回答是你所做的一切都是正确的,如果你有足够的内存来容纳那些5
字符和\0
,如果你想把它当作一个字符串(NUL终止{ {1}}数组)。
char
是一个只包含""
的字符串文字。该字符串的长度为\0
。阵列怎么样?将0
应用于它会显示它能够容纳一个字符。 (它包含sizeof
)。
现在使用您的代码,您确实可以访问超出数组大小的位置。这是未定义的行为 - 由C标准提及。
解决方案是要么有一个数组,其大小能够保存有一天你想要存储的最大字符。或者您可以使用\0
,通过使用char*
,malloc
等函数为其分配已分配块的地址。有益于此,您可以根据需要增加内存运行时取决于您要存储的字符数。