1

我正在使用的数组是:

char arr[91][12];

所以我使用 for 循环从文件中填充我的数组,如下所示:

for(i = 0; fgets(arr[i], 12, inFile); i++){}

当我想打印该数组中的任何内容时,它会自动转义到下一行。

测试该数组:

for(i = 0; fgets(arr[i], 12, inFile); i++){
    printf("%s", arr[i]);
}

//one
//two
//three etc.

//want it to be 'one two three etc.'

我正在尝试使用strpbrk()查找\n数组中的每个字符串并将其更改为\0

for(i = 0; fgets(arr[i], 12, inFile); i++){
if(strpbrk(arr[i], "\n") != NULL ){
    arr[i][strpbrk(arr[i], "\n")] = '\0';
    }
printf("%s", arr[i]);
}

但这给了我错误。有没有更好的方法来做我想做的事情?

4

3 回答 3

5

它实际上比你想象的要简单得多。如果换行符在末尾(就像使用 读取时一样fgets),只需将最后一个字符更改为字符串终止符:

arr[i][strlen(arr[i]) - 1] = '\0';

-1是因为数组(可以认为是字符串)从零开始索引并转到length - 1.


为了确保你真的一个换行符,你可以strpbrk像你一样使用 eg (但当然不是你在其他答案中解释的方式)。但我认为使用strrchr. 首先是因为它更简单(只搜索字符而不是字符串),其次是因为它从末尾开始搜索:

char *newlineptr = strrchr(arr[i], '\n');
if (newlineptr != NULL)
    *newlineptr = '\0';

或者最快的方式:

size_t length = strlen(arr[i]);
if (arr[i][length - 1] == '\n')
    arr[i][length - 1] = '\0';
于 2013-02-20T02:14:14.463 回答
4

strpbrk()返回一个指向换行符的指针,所以你应该只使用一次:

char *nl;

if ((nl = strpbrk(arr[i], "\n")) != NULL)
    *nl = '\0';

或者,换行符将是字符串中的最后一个字符,所以这也有效:

size_t len = strlen(arr[i]);
if (arr[i][len-1] == '\n')
   arr[i][--len] = '\0';

请注意,这会检查您是否有换行符;fgets()当 NUL 之外的任何内容的空间用完时停止读取'\0',即使它还没有读取换行符。这也为您提供了字符串的长度(strpbrk()间接地也是如此;它是nl - arr[i] - 1)。请注意strpbrk()和它的相对strcspn()比 更复杂strlen()

于 2013-02-20T02:16:13.677 回答
3

strpbrk返回一个指向. '\n'所以改变:

arr[i][strpbrk(arr[i], "\n")] = '\0';

到:

*strpbrk(arr[i], "\n") = '\0';
于 2013-02-20T02:13:45.297 回答