我试图创建一个带字符串的函数(例如:" Hello我在stackoverflow")并打印出具有给定宽度的字符串。因此,如果宽度为10
你好我
在stackov上
erflow
`void Left(char* words, int width)
{
int length = strlen(words);
int divisions = length / width; //How many lines there will be
if (divisions%length!=0) divisions+=1; //If some spillover
printf("%d = divisions \n", divisions);
char output[divisions][width];
int i;
int temp;
for(i=0; i < divisions; i++)
{
strncpy(output[i][temp], words, width);
output[i][width] = '\0';
temp+= width;
}
}`
这是我到目前为止所写的功能。因此,输出将具有与新行一样多的行,每行具有与宽度给出的文本一样多的文本。我认为我使用strncpy错了,但我不确定。有什么帮助吗?
答案 0 :(得分:1)
你正朝着正确的方向前进,但有些事情需要首先得到认可:
char output[divisions][width];
是一个字符串数组,其中包含“divisions”数量的char字符串,每个字符串的大小为“width”。而strncpy将'char *'作为目标缓冲区的参数。 http://man7.org/linux/man-pages/man3/strcpy.3.html
因此,要复制案例中的数据,您需要提供目标字符串,如下所示 -
strncpy(&output[i], words, width);
这会将数据的'width'长度从字符串'words'复制到字符串'output [i]'。
现在为了使你的函数工作,你必须在每次迭代后向前移动'words'指针。例如: 前10个字节 - “Hello I am”被从'words'复制到'output [0]'所以你需要在下一次迭代中从第11个字节开始处理,所以只需添加
words += width;
printf("%s \n", output[i]);
另外,如前面的回答所述,不要忘记字符串终结符和其他边界条件。
答案 1 :(得分:0)
字符串的宽度不包括字符串终止符,因此output[i][width] = '\0';
会将终止符写入越界。