我正在檢查一個函式是否回傳 true,它根據我得到的其他一些函式列印出有效的字串。目前,它正在正確列印出來,但它也在列印似乎與無效字串相對應的空行。
我怎樣才能讓這些空行消失?
這是我的代碼:
int main()
{
int i, count = 0;
char input[10];
char validStr[10][60] = {""};
for (i = 0; i < 60; i){
if(fgets(input,10, stdin) == NULL){
break;
}
input[strcspn(input,"\n")] = '\0';
if(checkIfValid(input)){
memcpy(validStr[i],input,sizeof(input));
count ;
}
}
printf("%d\n",count);
for (int j = 0 ; j < count; j){
printf("%s\n",validStr[j]);
}
}
計數表明它僅列印有效字串,但正如您從圖片中可以看出的那樣,它列印白線。

注意:由于各種原因,程式需要遵循當前順序,因此在第一個 for 回圈之后列印輸出。
提前致謝!
uj5u.com熱心網友回復:
取而代之的是:
if(checkIfValid(input)){
memcpy(validStr[i],input,sizeof(input));
count ;
}
這個:
if(checkIfValid(input)){
memcpy(validStr[count],input,sizeof(input));
count ;
}
正如其他人在評論中指出的那樣,您希望安全地保護該字串副本。我可以建議:
if(checkIfValid(input)){
char* dst = validStr[count];
size_t MAXLEN = 10;
strncpy(dst, input, MAXLEN);
dest[MAXLEN-1] = '\0';
count ;
}
uj5u.com熱心網友回復:
繼續注釋,如果要存盤整個字串,則需要為空終止字符提供足夠的空間。
AAAAAAAAAA
QELETIURTE
...
包含長度為 10 個字符且不符合input宣告的字串char[10]。
不是用 a 回圈,而是for允許從fgets()控制你的讀取回圈回傳并保持count作為控制回圈的條件,以確保你保護你的陣列邊界,例如
#include <stdio.h>
#include <string.h>
#define MAXC 128 /* if you need a constant, #define one (or more) */
#define NSTR 10
int checkIfValid (const char *s) { return 1; (void)s; }
int main(void)
{
size_t count = 0;
char input[MAXC];
char validStr[NSTR][MAXC] = {""};
while (count < NSTR && fgets (input, sizeof input, stdin)) {
input[strcspn(input,"\n")] = '\0';
if(checkIfValid(input)){
strcpy (validStr[count], input);
count ;
}
}
printf ("%zu\n",count);
for (size_t j = 0 ; j < count; j) {
printf("%s\n",validStr[j]);
}
}
(調整你的陣列宣告為 60 個字串,每個字串 10 個字符)
如果您想切斷9字符并確保以空字符結尾,@selbie 已經涵蓋了這一點。
示例使用/輸出
使用您的資料(dat/validstr.txt盡我所能),您可以執行以下操作:
$ ./bin/validstring <dat/validstr.txt
6
AAAAAAAAAA
QELETIURTE
321qweve
sdsdsdfFF
GRSGGFDDSS
toLotssAAA
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359874.html
標籤:C
上一篇:根據特定值多次呼叫#define
下一篇:AddPoint(x,y)使用C
