2013-04-04 176 views
0

我打算修改特定字符串的每個其他字母。但爲了這個程序的目的,沒有發生這種情況。到目前爲止,我已從用戶處抓取一個字符串並將其存儲在userinput中,並打算將其打印出來。使用scanf()函數

#include <stdio.h> 
#include <string.h> 

int main(void) {  
char userinput[256] =""; 
printf("Enter somthing to change:\n"); 
scanf("%s", &userinput); 
printf("%s\n", userinput); 

int k = 2; // This is just here to do something every time k is even 
int j = strlen(userinput); 
for (int i = 0; i < j; i++) { 

    if(k % 2 == 0) { 
     printf("%s", userinput[i]); 
     k++; 
    } 
    else { 
     printf("%s", userinput[i]); 
     k++; 
    } 
} 

} 

strlen()但是功能上不userinput工作。我想這是因爲strlen()應該採用字符串的第一個字符的地址,然後迭代,直到達到一個空字符,但scanf實際上並沒有創建一個空字符。 我想不出在字符串後面加入'\0'而不知道字符串長度的方法。

如果存儲在數組中,我將如何訪問存儲的字符序列的長度?

+1

「'strlen()'函數在'userinput'上不起作用」以什麼方式? 'strlen(userinput)'是 - 除非輸入超出數組 - 一個有效的調用。 – 2013-04-04 14:07:41

回答

6

此:

scanf("%s", &userinput); 

應該是:

scanf("%s", userinput); 

運營商&的地址是不需要的,和不正確的。當傳遞給函數時,數組衰減到其第一個元素的地址。 scanf("%s")將附加一個空終止字符,所以不需要顯式插入一個。

要防止潛在的緩衝區溢出,請指定scanf()應寫入userinput的最大字符數。這應該是比userinput大小少一個,留有餘地終止空字符:

scanf("%255s", userinput); 

不正確的格式說明(這是未定義的行爲)正被用於打印的userinputchar acters:使用%c%s。這:

printf("%s", userinput[i]); 

必須是:

printf("%c", userinput[i]); 
1

更改此

scanf("%s", &userinput); 

scanf("%s", userinput); 

我們必須使用地址scanf

  • 如果我們將掃描到一個int a那麼我們要調用scanf()a =>&a
  • 地址。如果我們將掃描成double a那麼我們要調用scanf()a =>&a地址
  • 但是如果我們將掃描數據與指針(存儲器地址)int *a;或字符數組char a[50];然後我們必須調用scanf()用指針或與陣列而不添加&

scanf()

根據格式字符串,函數可能期望的 附加參數的序列,每個都包含一個指針,其中所提取的字符的解釋中存儲有分配的存儲 適當的類型。這些參數中至少應該包含與格式說明符存儲的值數量一樣多的參數。 該函數將忽略其他參數。這些自變量爲 預期爲指針:要將scanf操作的結果存儲在 常規變量中,其名稱應以參考 運算符(&)(請參閱示例)開頭。

+0

這很有道理。我想我對'char userinput [256]'的初始聲明有點困惑。如果我是正確的,它是指向數組的第一個字符的指針,但它不需要被聲明爲這樣。這就是爲什麼當我去存儲它時,我認爲我需要給出地址 – Deepak 2013-04-04 18:59:55

1

變化

scanf("%s", &userinput); 

scanf("%s", userinput); 

沒有在字符串捕獲的情況下所需的&操作。 scanf()自動將空字符('\0')附加到字符串的末尾,因此int j = strlen(userinput);應該工作。

如果仍要計算長度沒有此功能的有效這裏是鏈接How to calculate the length of a string in C efficiently?

1

你感到困惑類型,正如其他人指出。當你對類型感到困惑時使用scanf和printf是很危險的!

scanf(「%s」,& userinput);

類型的&userinputchar (*)[256],但預計的scanf %s以對應於char *。由於期望的類型和給出的類型不同,並且不需要具有相同的表示,所以行爲是未定義的。

我想,這是因爲strlen的是應該採取一個字符串的 第一個字符的地址,然後重複,直到到達一個空字符,但 scanf函數實際上並沒有創建一個空字符。

錯誤。當您使用%s格式說明符時,scanf肯定會分配一個空字符。也就是說,提供scanf不會遇到錯誤或EOF。關於這一點,你應該檢查是否有錯誤從scanf函數:

if (scanf("%s", userinput) != 1) { 
    /* Insert error handling here */ 
} 

...因爲你應該在C.

k所有標準庫函數是沒有意義的。您的循環已經以k的頻率遞增i

strlen返回一個size_t。確保您將返回值存儲在正確的類型中。如果函數返回size_t,則將返回值存儲在size_t中。如果函數返回int,則將返回值存儲在int中。得到它了?無論返回類型是什麼,都是用於存儲返回類型的類型。使用手冊找出。

printf("%s", userinput[i]);

有一次那種混亂。 userinput[i]char%s告訴printf預計char *。當參數無效時,行爲是未定義的。這可能會導致程序出現故障。考慮printf("%c", userinput[i]);printf("%s", &userinput[i]);