我正在使用的数组是:
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]);
}
但这给了我错误。有没有更好的方法来做我想做的事情?
答案 0 :(得分:5)
它实际上比您想象的要简单得多。如果换行符结束(就像用fgets
读取时那样),只需将最后一个字符更改为字符串终止符:
arr[i][strlen(arr[i]) - 1] = '\0';
-1
是因为数组(如字符串可以被认为是)在零开始索引并转到length - 1
。
为确保您确实拥有换行符,您可以使用例如strpbrk
就像你一样(但当然不像你在其他答案中解释的那样)。但我认为使用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';
答案 1 :(得分: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()
更复杂。
答案 2 :(得分:3)
strpbrk
将指针返回给'\n'
。所以改变:
arr[i][strpbrk(arr[i], "\n")] = '\0';
为:
*strpbrk(arr[i], "\n") = '\0';