[英]small C program doesnt work
我試圖制作一個程序來獲取用戶輸入(行),並打印出超過80個字符的最長行。 我編寫了程序,但是運行它時,它輸出了一些非常奇怪的符號。 您能告訴我我的代碼可能出什么問題嗎?
#include <stdio.h>
#define MINLINE 80
#define MAXLINE 1000
int getline(char current[]);
void copy(char from[], char to[]);
int main(void)
{
int len; // current input line lenght
int max; // the lenght of a longest line that's over 80 characters
char current[MAXLINE]; // current input line
char over80[MAXLINE]; // input line that's over 80 characters long
while (len = (getline(current)) > 0) {
if (len > MINLINE) {
max = len;
copy(current, over80);
}
}
if (max > 0) {
printf("%s", over80);
}
else {
printf("No input line was over 80 characters long");
}
return 0;
}
int getline(char current[]) {
int i = 0, c;
while (((c = getchar()) != EOF) && c != '\n') {
current[i] = c;
++i;
}
if (i == '\n') {
current[i] = c;
++i;
}
current[i] = '\0';
return i;
}
void copy(char from[], char to[]) {
int i = 0;
while ((to[i] = from[i]) != '\0') {
++i;
}
}
非常感謝您的幫助 !
如果找不到長行,則無法初始化max
。 然后在if (max > 0)
使用它是未定義的行為。
這行:
while (len = (getline(current)) > 0) {
將(getline(current)) > 0)
的值分配給len
,這不是您想要的(之后len將為0或1。
編輯:剛看到AusCBloke的評論,您還應該同時檢查len > max
和 len > MINLINE
否則您將得到的最新len > MINLINE
於80個字符,而不是最長的len > MINLINE
。
您還應該將max
初始化為0,因此應為
max = 0;
while ((len = getline(current)) > 0) {
if ((len > MINLINE) && (len > max)) {
其他小錯誤/提示:
假設這是一項家庭作業,這是一個提示:這段代碼看起來非常可疑:
if (i == '\n') {
current[i] = c;
++i;
}
由於i
代表一個位置並且從未分配過字符,因此您可以有效地檢查該位置是否等於ASCII代碼'\\n'
。
您的復制方法不能為null終止字符串:
void copy(char from[], char to[]) {
int i = 0;
while ((to[i] = from[i]) != '\0') {
++i;
}
to[i] = '\0'
}
這可能解釋了正在打印的怪異字符。
您可以使用內置的strcpy()使生活更輕松。
如果您提供的輸入數據行數超過1000個字符,則固定大小的緩沖區將溢出。 通過輸入這樣的輸入,我可以實現以下輸出:
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
我目前無法測試您的代碼,但這可能是由於未清除字符數組引起的。 嘗試將char數組設置為0。
您的代碼有很多問題。 大多數情況下,這是由於車輪的重新發明。
int getline(char current[]);
您不需要定義自己的getline()
, stdio.h
已經有一個。
void copy(char from[], char to[]);
還有許多用於在string.h
復制字符串的函數。
初始化所有0f變量也是一個好主意,如下所示:
int len = 0; // current input line length
...這可以防止以后出現問題,例如在未初始化時與max
進行比較。
如果您這樣初始化max
...
int max = MINLINE; // the length of a longest line that's over 80 characters
...然后,以后進行長度比較會更容易。
char* current = NULL;
size_t allocated = 0;
如果current
為NULL
,則getline()
將分配用於存儲行的緩沖區,該緩沖區應由用戶程序free
。 getline()
還使用一個指向size_t
的指針,該指針包含存儲行所需的字節數。
while (len = (getline(current)) > 0) {
應該由以下內容代替...
while ((len = getline(¤t, &allocated, stdin)) > 0) {
...更新並比較len
與0
。
現在,而不是...
if (len > MINLINE) {
...您需要與我們早先初始化的最后最長線進行比較...
if (len > max) {
...然后您就可以像以前那樣更新max
...
max = len;
在調用copy()
使用strncpy()
,這將防止您在分配的緩沖區中寫入超過1,000個字符:
strncpy(over80, current, MAXLINE);
由於我們初始化了max
,因此您需要在末尾將檢查從if (max > 0)
更改為if (max > MINLINE)
。
另一個提示,更改以下行...
printf("No input line was over 80 characters long");
...至...
printf("No input line was over %d characters long", MINLINE);
...將意味着您只需要更改文件頂部的#define
即可增加或減少最小長度。
別忘了...
free(current);
...以防止內存泄漏!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.