簡體   English   中英

我無法在 C 中將 argv 轉換為上

[英]I'm having trouble converting argv to upper in C

我正在嘗試將固定大小的 argv 轉換為上和下,但它要么給我分段錯誤,要么只是在 var 上存儲亂碼。 我試過這個:

#include <stdlib.h>
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(int argc, string argv[])
{
    string lower = "abcdefghijklmnopqrstuvwxyz";
    string upper = "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0, n = 26; i < n; i++)
    {
        lower[i] = tolower(argv[1][i]);
        upper[i] = toupper(argv[1][i]);
    }
}

或者:

string lower = "";
string upper = "";

//check if repeated chars or numbers
for (int i = 0, n = 26; i < n; i++)
{
    printf("%c\n",(char) argv[1][i]);
    printf("%c\n",(char) argv[1][i]);
    printf("%c\n",tolower(argv[1][i]));
    printf("%c\n",toupper(argv[1][i]));
    lower += tolower(argv[1][i]);
    upper += toupper(argv[1][i]);
}

最奇怪的部分是 printf 給出了正確的值,但它們並沒有存儲在lowerupper中。 我在這里做什么?

您不能在 C 到 append 中使用+=到字符串。

<cs50.h>string定義為char * 然后string lower = ""; lower定義為char *並將其設置為指向""的第一個字符。 ""表示一個null字符串,該字符串的第一個也是唯一一個字符是null(零值)字符,表示字符串的結束。

attempts to advance the pointer by elements of the type it points to.當應用指針時, += 嘗試將指針前進它指向的類型的元素。 例如,如果指針p指向數組的元素 3,則p += 4將使其指向元素 7。

由於lower指向只有一個元素的數組元素,因此 null 字符lower += tolower(argv[1][i])試圖使其指向數組外部。 C 標准未定義該行為。 (除非它可能在 C 實現中,其中應用於該字符的tolower會產生一個值為 1 的字符。這將修改lower以指向數組中的最后一個元素,這是一個特殊的 position 允許用於指針運算。 )

使用string lower = "abcdefghijklmnopqrstuvwxyz"; ,你有更多的空間來做數組運算; 一些添加到lower將起作用。 但是, tolower(argv[1][i])可能太大而無法保留在數組中。

此外,即使指針算術有效, lower += …也只會更改指針。 它不會改變它指向的字符。

為了使您的代碼正常工作,您需要分配足夠的 memory 來保存生成的字符串,包括 null 字符,並且您必須將lower設置為指向該 memory,類似地設置為upper 您需要的字符數是strlen(argv[1][i]) + 1 如果你已經學會了如何使用malloc ,你可以使用它。 如果您有保證argv[1]正好是 26 個字符的固定分配,您可以定義lower並通過用char lower[27]; ,對於upper也是如此。

然后,您必須將字符復制到該 memory 中,您可以使用lower[i] = tolower(argv[1][i]); . 將字符復制到數組中后,應在其末尾寫入一個 null 字符,以形成一個完整的 C 字符串。 (如果您不打算將數組打印為字符串或以其他方式將其用作字符串,則可以省略它。)

如果您調用man toupper ,您將了解到 function 不采用字符串,而是采用字符。 因此,實現您所追求的一種方法是遍歷命令行參數中的每個字符,對其調用toupper ,然后將結果存儲回來。

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

void main(int argc, char *argv[])
{
  printf("before: %s\n", argv[1]);

  for (unsigned int i = 0, n = strlen(argv[1]); i < n; i++) {
    argv[1][i] = (char) toupper(argv[1][i]);
  }

  printf("after:  %s\n", argv[1]);  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM